Jakie są wady Stackless Python? [Zamknięte]

127

Czytałem ostatnio o Stackless Pythonie i wydaje się, że ma on wiele zalet w porównaniu z waniliowym cPythonem. Ma wszystkie te fajne funkcje, takie jak nieskończona rekurencja, mikrowątki, kontynuacje itp., A jednocześnie jest szybszy niż cPython (około 10%, jeśli wierzyć wiki Pythona ) i jest z nim kompatybilny (co najmniej wersje 2.5, 2.6 i 3.0).

Wszystko to wygląda zbyt dobrze, aby mogło być prawdziwe. Jednak TANSTAAFL , nie widzę entuzjazmu dla Stackless wśród społeczności Pythona, a PEP 219 nigdy nie został zrealizowany. Dlaczego? Jakie są wady Stackless? Jakie szkielety są ukryte w szafie Stackless?

(Wiem, że Stackless nie oferuje prawdziwej współbieżności, po prostu prostszy sposób programowania w równoległy sposób. Nie przeszkadza mi to.)

Ryszard Szopa
źródło

Odpowiedzi:

165

Nie wiem, skąd wzięło się stwierdzenie „Stackless jest 10% szybsze” na Wiki, ale z drugiej strony nigdy nie próbowałem zmierzyć tych wskaźników wydajności. Nie mogę sobie wyobrazić, co robi Stackless, aby zrobić tak wielką różnicę.

Stackless to niesamowite narzędzie z kilkoma problemami organizacyjnymi / politycznymi.

Pierwsza pochodzi z historii. Christian Tismer zaczął mówić o tym, co ostatecznie stało się Stackless około 10 lat temu. Miał pojęcie, czego chce, ale trudno mu było wyjaśnić, co robi i dlaczego ludzie powinni go używać. Dzieje się tak częściowo dlatego, że jego zaplecze nie miało szkolenia CS dotyczącego pomysłów takich jak coroutines oraz dlatego, że jego prezentacje i dyskusje są bardzo zorientowane na implementację, co jest trudne dla każdego, kto nie jest jeszcze głęboki w kontynuacji, aby zrozumieć, jak wykorzystać je jako rozwiązanie ich problemy.

Z tego powodu początkowa dokumentacja była słaba. Było kilka opisów, jak go używać, z najlepszymi od zewnętrznych dostawców. Na PyCon 2007 wygłosiłem wykład na temat „ Korzystanie ze Stackless ”, który wypadł całkiem nieźle, zgodnie z danymi ankietowymi PyCon. Richard Tew wykonał świetną robotę, zbierając je, aktualizując stackless.com i utrzymując dystrybucję, gdy pojawią się nowe wydania Pythona. Jest pracownikiem CCP Games , twórcy EVE Online, która wykorzystuje Stackless jako istotną część swojego systemu gier.

Gry CCP to także największy przykład z rzeczywistego świata, z którego ludzie korzystają, gdy mówią o Stackless. Głównym samouczkiem dla Stackless jest „ Wprowadzenie do programowania współbieżnego w języku Stackless Python ” Granta Olsona , które również jest zorientowane na grę. Myślę, że to daje ludziom wypaczony pogląd, że Stackless jest zorientowany na gry, podczas gdy gry są bardziej zorientowane na kontynuację.

Kolejną trudnością był kod źródłowy. W swojej pierwotnej formie wymagał zmian w wielu częściach Pythona, co spowodowało, że Guido van Rossum, lider Pythona, był ostrożny. Myślę, że jednym z powodów było wsparcie dla call / cc, które zostało później usunięte jako „zbyt podobne do wspierania goto, gdy istnieją lepsze formy wyższego poziomu”. Nie jestem pewien co do tej historii, więc przeczytaj ten akapit jako „Bez stosu wymagał zbyt wielu zmian”.

Późniejsze wydania nie wymagały zmian, a Tismer nadal naciskał na włączenie go do Pythona. Chociaż było trochę rozważań, oficjalne stanowisko (o ile wiem) jest takie, że CPython jest nie tylko implementacją Pythona, ale ma być implementacją referencyjną i nie będzie zawierał funkcjonalności Stackless, ponieważ nie może być zaimplementowany przez Jython lub Iron Python.

Nie ma absolutnie żadnych planów dotyczących „ znaczących zmian w bazie kodu ”. Ten cytat i odsyłacz z Arafangiona (patrz komentarz) pochodzą z około 2000/2001. Zmiany strukturalne już dawno się dokonały, o czym wspomniałem powyżej. W obecnej postaci bez stosu jest stabilny i dojrzały, z niewielkimi zmianami w kodzie w ciągu ostatnich kilku lat.

Ostatnie ograniczenie w przypadku Stackless - nie ma zdecydowanego zwolennika Stackless. Tismer jest teraz głęboko zaangażowany w PyPy , która jest implementacją Pythona dla Pythona. Zaimplementował funkcję Stackless w PyPy i uważa ją za znacznie lepszą od samej Stackless i uważa, że ​​PyPy to droga na przyszłość. Tew utrzymuje Stackless, ale nie jest zainteresowany rzecznictwem. Zastanawiałem się, czy nie zostać w tej roli, ale nie widziałem, jak mógłbym z tego zarobić.

Jeśli chcesz trenować w Stackless, napisz do mnie ! :)

Andrew Dalke
źródło
39

znalezienie tej dyskusji zajęło dość dużo czasu. W tym czasie nie byłem na PyPy, ale miałem 2-letni romans z psyco, dopóki zdrowie nie zatrzymało tego wszystkiego dość gwałtownie. Jestem teraz ponownie aktywny i projektuję alternatywne podejście - zaprezentuję je na EuroPythonie 2012.

Większość stwierdzeń Andrews jest poprawna. Kilka drobnych dodatków:

Stackless był znacznie szybszy niż CPython 10 lat temu, ponieważ zoptymalizowałem pętlę interpretera. W tamtym czasie Guido nie był na to gotowy. Kilka lat później ludzie dokonali podobnych optymalizacji, a nawet więcej i lepszych, co sprawia, że ​​Stackless jest nieco wolniejszy, zgodnie z oczekiwaniami.

Po włączeniu: cóż, na początku byłem bardzo nachalny i przekonany, że Stackless to najlepszy wybór. Później, kiedy było już prawie możliwe, że zostałem uwzględniony, straciłem zainteresowanie tym tematem i wolałem pozostać w ten sposób, częściowo z powodu frustracji, częściowo, aby zachować kontrolę nad Stackless.

Argumenty takie jak „inne implementacje tego nie potrafią” wydawały mi się zawsze kiepskie, ponieważ istnieją inne przykłady, w których można również użyć tego argumentu. Pomyślałem, że lepiej o tym zapomnieć i pozostać w dobrej przyjaźni z Guido, mając własną dystrybucję.

Tymczasem sytuacja znów się zmienia. Pracuję nad PyPy i Stackless jako rozszerzenie. Porozmawiam o tym później

Pozdrawiam - Chris

tismer
źródło
5

Jeśli dobrze pamiętam, Stackless miał zostać włączony do oficjalnego CPythona, ale autor stackless powiedział ludziom CPythona, żeby tego nie robili, ponieważ planował wprowadzić pewne znaczące zmiany w bazie kodu - przypuszczalnie chciał, aby integracja została wykonana później, kiedy projekt był bardziej dojrzały.

Arafangion
źródło
1
Źródło? Uważam to za interesujące, ale oczywiście nie mogę ci uwierzyć tylko dlatego, że tak powiedziałeś. Wyglądałbym na głupka, gdybyś się mylił i zacząłem mówić o tym, jakie to było interesujące.
Devin Jeanpierre
2
Doskonała uwaga. Przepraszam, że nie mam odniesienia, ponieważ było to w rozmowie z irc w #pythonie na freenode, jednak udało mi się znaleźć starożytną rozmowę na liście mailingowej na gnosis.cx/download/charming_python_10_outtakes.html, co daje dużo więcej wglądu w sytuacja.
Arafangion
Ten link jest naprawdę świetny. Odpowiada na wiele moich pytań.
Ryszard Szopa
Ten link ma 8 lub 9 lat (mówi o Pythonie 2.1) i wszelkie dyskusje na temat przyszłych zmian w bazie kodu już dawno się pojawiły. Python bez stosu jest stabilny i dojrzały i nie ma w planach „znaczących zmian w kodzie”.
Andrew Dalke
dalke: Tak jest - jeśli nastąpiły istotne zmiany w jakichkolwiek decyzjach o integracji zmian, nie krępuj się wymyślić nowszej referencji, jednak podejrzewam, że to starożytne źródło, które podałem, po prostu zapoczątkowało trend na oddzielne warianty z pythona, np. JPython, IronPytion ..
Arafangion
3

Interesują mnie również odpowiedzi tutaj. Grałem trochę w Stackless i wygląda na to, że byłby to dobry, solidny dodatek do standardowego Pythona.

PEP 219 wspomina o potencjalnych trudnościach z wywołaniem kodu Pythona z kodu C, jeśli Python chce przejść na inny stos. Musiałyby istnieć sposoby, aby to wykryć i zapobiec temu (aby uniknąć zniszczenia stosu C). Myślę jednak, że jest to wykonalne, więc zastanawiam się również, dlaczego Stackless musi stać samodzielnie.

Greg Hewgill
źródło
3
PEP 219 ma 9 lat i jest poważnie nieaktualny. Trudności związane z „wywołaniem kodu Pythona z kodu C” występują tylko w implementacji omówionej w PEP, a nie w Stackless. Nazwa PEP („Stackless Python”) jest trochę myląca; czerpał inspirację ze Stackless i to wszystko.
Andrew Dalke