Ho guardato la conversazione Tre bei Quicksorts e mi sono messo a fare i conti con quicksort. La mia implementazione in python era molto simile a c (selezionare pivot, partizionare attorno ad esso e ricorrere su partizioni sempre più piccole). Che pensavo non fosse pythonic.Quicksort di Python - Comprensione delle liste vs Ricorsione (routine di partizione)
Quindi questa è l'implementazione utilizzando la comprensione degli elenchi in 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
Consente di richiamare il methoqsortR di ricorsione. ora ho notato che qsortR gira molto più lentamente di qsort per elenchi di grandi dimensioni (r). In realtà "profondità massima di ricorsione superata in cmp" anche per 1000 elemetri per metodo di ricorsione. Che ho ripristinato in sys.setrecursionlimit.
Alcuni numeri:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
Tutto il codice è here.
Ho un paio di domande:
- Perché è di lista in modo molto più veloce?
- Alcuni chiarimenti sul limite della ricorsione in python. Per prima cosa l'ho impostato su 100000 in quali casi dovrei stare attento?
- (Che cosa si intende per 'ottimizzare ricorsione in coda', come si fa?)
- cercando di risolvere 1000000 elementi accaparrati memoria del mio computer portatile (con il metodo ricorsione). Cosa devo fare se voglio ordinare tanti elementi? Che tipo di ottimizzazioni sono possibili?
hmmm. buona idea. Fammi provare. – swair
hai ragione. È diventato più veloce ma non veloce come il metodo di comprensione delle liste. numeri: 1.2 per una lista di 1000 elem e 3.41 per 2000 elem – swair