Vi la charla Tres hermosos Quicksorts y estaba jugando con el quicksort. Mi implementación en python fue muy similar a c (seleccione pivote, particion alrededor y recursión en particiones más pequeñas y más grandes). Lo cual pensé que no era pythonic.Python quicksort - Lista de comprensión vs Recursion (rutina de partición)
Así que esta es la implementación que usa la lista de comprensión en python.
def qsort(list):
if list == []:
return []
pivot = list[0]
l = qsort([x for x in list[1:] if x < pivot])
u = qsort([x for x in list[1:] if x >= pivot])
return l + [pivot] + u
Llamemos a la recursion metho qsortR. ahora noté que qsortR corre mucho más lento que qsort para listas grandes (r). En realidad, "la máxima profundidad de recursión excedida en cmp" incluso para 1000 elems para el método de recursión. Lo reinicié en sys.setrecursionlimit.
Algunos números:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
Todo el código es here.
Tengo un par de preguntas:
- ¿Por qué es tan lista por comprensión mucho más rápido?
- Alguna aclaración sobre el límite de la recursión en python. Primero lo configuré en 100000, ¿en qué casos debo tener cuidado?
- (¿Qué se entiende exactamente por 'la optimización de recursión de cola', ¿cómo se hace?)
- Tratando de resolver 1000000 elementos hogged memoria de mi ordenador portátil (con el método de la repetición). ¿Qué debo hacer si quiero ordenar tantos elementos? ¿Qué tipo de optimizaciones son posibles?
hmmm. buena idea. Déjame probar eso. – swair
tienes razón. Se hizo más rápido pero no tan rápido como el método de comprensión de la lista. números: 1.2 para una lista de 1000 elems y 3.41 para 2000 elems – swair