Oglądałem rozmowę Three Beautiful Quicksorts i bawiłem się z quicksort. Moja implementacja w Pythonie była bardzo podobna do c (wybierz pivot, partycję wokół niego i powtarzanie na mniejszych i większych partycjach). Które myślałem, że nie był pythonic.Python quicksort - List comprehension vs Recursion (procedura partycji)
Jest to implementacja wykorzystująca zrozumienie list w pythonie.
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
Pozwala wywołać metodę rekursji qsortR. teraz zauważyłem, że qsortR działa znacznie wolniej niż qsort dla dużych (r) list. Właściwie "maksymalna głębokość rekurencji przekroczona w cmp" nawet dla 1000 elemów dla metody rekursji. Które resetuję w sys.setrecursionlimit.
Niektóre numery:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
Cały kod jest here.
Mam kilka pytań:
- Dlaczego lista zrozumienie tak dużo szybciej?
- Oświecenie na granicy rekursji w pytonie. Najpierw ustawiłem ją na 100000 w jakich przypadkach powinienem być ostrożny?
- (Co dokładnie należy rozumieć przez „optymalizację rekursji ogon”, jak to się robi?)
- Próbując uporządkować 1000000 elementy hogged pamięć o moim laptopie (metodą rekursji). Co powinienem zrobić, jeśli chcę sortować tak wiele elementów? Jakie rodzaje optymalizacji są możliwe?
hmmm. dobry pomysł. Pozwól mi to wypróbować. – swair
masz rację. Zrobiło się szybciej, ale nie tak szybko, jak metoda rozumienia listy. liczby: 1,2 dla listy 1000 elemów i 3,41 dla elemów 2000 – swair