2009-02-26 13 views
117

Czytałem ostatnio o Stackless Python i wydaje się, że ma wiele zalet w porównaniu do wanilii cPython. Ma wszystkie te fajne funkcje, takie jak nieskończona rekurencja, mikroprocesory, kontynuacje itd., A jednocześnie jest szybsza niż cPython (około 10%, jeśli wierzyć the Python wiki), to jest kompatybilny z i (przynajmniej wersje 2.5, 2.6 i 3.0).Jakie są wady Stackless Python?

Wszystkie te elementy wyglądają na zbyt piękne, aby mogły być prawdziwe. Jednakże, TANSTAAFL, nie widzę wiele entuzjazmu dla Stackless wśród społeczności Python, a PEP 219 nigdy nie doszła do realizacji. Dlaczego? Jakie są wady Stackless? Jakie szkielety są ukryte w szafie Stackless?

(wiem Stackless nie oferuje prawdziwą współbieżność, po prostu łatwiejszy sposób programowania w równoczesnej sposób. Tak naprawdę nie przeszkadza mi.)

Odpowiedz

149

Nie wiem, skąd wziął się "Stackless jest o 10% szybszy" na Wiki, ale z drugiej strony nigdy nie próbowałem mierzyć tych liczb wydajności. Nie mogę myśleć o tym, co Stackless robi, żeby 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ł wyobrażenie o tym, czego chciał, ale trudno mu było wyjaśnić, co robi i dlaczego ludzie powinni go używać. Dzieje się tak częściowo dlatego, że jego wykształcenie nie miało przeszkolenia w zakresie CS w odniesieniu do pomysłów takich jak coroutines, a jego prezentacje i dyskusja są zorientowane na wdrażanie, co jest trudne dla każdego, kto nie jest jeszcze w głębi duszy, aby zrozumieć, jak używać go jako rozwiązania ich problemy.

Z tego powodu początkowa dokumentacja była słaba. Było kilka opisów tego, jak go używać, z najlepszymi z zewnętrznych dostawców. W PyCon 2007 wygłosiłem wykład na temat "Using Stackless", który sprawdził się całkiem dobrze, według danych z ankiety PyCon. Richard Tew wykonał świetną robotę zbierając je, aktualizując stackless.com i utrzymując dystrybucję po pojawieniu się nowych wersji Pythona. Jest pracownikiem firmy CCP Games, twórcy EVE Online, który wykorzystuje Stackless jako istotną część swojego systemu gier.

Gry CCP to także największy przykład, który ludzie używają, gdy mówią o Stackless. Główny tutorial dla Stackless to "Introduction to Concurrent Programming with Stackless Python" Granta Olsona, który jest również zorientowany na grę. Wydaje mi się, że daje to ludziom wypaczony pomysł, że Stackless jest zorientowany na gry, kiedy bardziej jest to, że gry są łatwiejsze do kontynuacji.

Kolejną trudnością jest kod źródłowy.W swojej pierwotnej formie wymagał zmian w wielu częściach Pythona, co sprawiło, że Guido van Rossum, prowadzący Python, był ostrożny. Jednym z powodów, moim zdaniem, 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 mam pewności co do tej historii, więc po prostu przeczytaj ten akapit jako "Stackless, który wymagał zbyt wielu zmian".

Późniejsze wydania nie wymagały zmian, a Tismer nadal naciskał na włączenie go do Pythona. Podczas gdy było pewne rozważanie, oficjalne stanowisko (o ile mi wiadomo) jest takie, że CPython jest nie tylko implementacją Pythona, ale ma służyć jako implementacja referencyjna i nie będzie zawierał funkcji Stackless, ponieważ nie może być zaimplementowana przez Jython lub Żelazny Python.

Nie ma absolutnie żadnych planów dotyczących "istotnych zmian w bazie kodu". Ten cytat i odnośnik do hiperłącza z Arafangiona (patrz komentarz) pochodzą z grubsza 2000/2001. Zmiany strukturalne już dawno zostały zrobione i to właśnie wspomniałem powyżej. Bezkształtne jak teraz jest stabilne i dojrzałe, z niewielkimi zmianami w kodzie źródłowym w ciągu ostatnich kilku lat.

Jedno ostateczne ograniczenie z Stackless - nie ma silnego adwokata dla 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 Stackless i uważa, że ​​PyPy jest drogą przyszłości. Tew utrzymuje Stackless, ale nie jest zainteresowany rzecznictwem. Rozważałem bycie w tej roli, ale nie mogłem zobaczyć, w jaki sposób mogę zarabiać na tym.

Chociaż, jeśli chcesz trenować w Stackless, zapraszam do contact me! :)

3

Jestem również zainteresowany w odpowiedzi tutaj. Grałem trochę z Stackless i wygląda na to, że byłby dobrym stałym dodatkiem do standardowego Pythona.

PEP 219 wspomina o potencjalnych problemach z wywołaniem kodu Pythona z kodu C, jeśli Python chce zmienić na inny stos. Musiałyby być sposoby na wykrycie i zapobieżenie temu (aby uniknąć zniszczenia stosu C). Myślę, że to jest podatne, więc zastanawiam się również, dlaczego Stackless musi stanąć na własną rękę.

+3

PEP 219 ma 9 lat i poważnie nieaktualne. Trudności "wywoływania kodu Pythona z kodu C" są tylko w implementacji omawianej w PEP i nie są w Stackless. Nazwa PEP ("Stackless Python") jest trochę myląca; czerpał inspirację z Stackless i to wszystko. –

4

Jeśli dobrze pamiętam, Stackless był planowany do włączenia do oficjalnego CPython, ale autor bezszeryfowej powiedział ludziom CPython, aby tego nie robili, ponieważ planował dokonać znaczących zmian w bazie kodu - prawdopodobnie chciał integracja została przeprowadzona później, gdy projekt był bardziej dojrzały.

+1

Źródło?Uważam to za interesujące, ale oczywiście nie mogę ci uwierzyć, ponieważ tak powiedziałeś. Patrząc na tego głupka, bym się mylił i zacząłem mówić, jakie to interesujące. –

+2

Doskonały punkt. Niestety nie mam referencji, ponieważ była ona w rozmowie irc w #python na freenode, jednak udało mi się znaleźć starą konwersację listy dyskusyjnej pod adresem http://gnosis.cx/download/charming_python_10_outtakes.html, która daje dużo więcej wglądu w sytuację. – Arafangion

+0

Ten link jest naprawdę świetny. Odpowiada na wiele moich pytań. –

34

zajęło dużo czasu, aby znaleźć tę dyskusję. Na tym czasu nie byłem na PyPy, ale miałem 2-letni romans z psyco, dopóki zdrowie nie zatrzymało tego całkiem nagle. Ponownie jestem aktywny i zaprojektowałem alternatywne podejście - zaprezentuję je na EuroPython 2012.

Większość oświadczeń Andrewsa jest poprawna. Niektóre z nich: drobne dodatki:

Stackless był znacznie szybszy niż CPython, 10 lat temu, ponieważ zoptymalizowałem pętlę interpretera. W tym czasie Guido nie był na to przygotowany. Kilka lat później ludzie zrobili podobne optymalizacje, a nawet więcej i lepszych, co sprawia, że ​​Stackless nieco wolniej, zgodnie z oczekiwaniami.

Po włączeniu: cóż, na początku byłem bardzo natarczywy i przekonany, że Stackless jest drogą do zrobienia. Później, gdy było to prawie możliwe do uwzględnienia, straciłem zainteresowanie tym i wolałem pozostawić ten stan, częściowo z frustracji, częściowo do zachować kontrolę nad Stackless.

Argumenty, takie jak "inne wdrożenia nie mogą tego zrobić" zawsze były dla mnie ułomne, ponieważ istnieją inne przykłady, w których argument ten mógłby również zostać użyty. Pomyślałem, że lepiej o tym zapomnieć i pozostać w dobrej przyjaźni z Guido, mając własną dystrybucję.

Tymczasem sprawy znów się zmieniają. Pracuję nad pypy i Stackless jako przedłużenie opowiedzą o które czasami później

Cheers - Chris

+0

Dzięki za wgląd, Chris. :) –

Powiązane problemy