Dlaczego Python nie został zoptymalizowany jak nowoczesne implementacje JavaScript?

11

Nowoczesne implementacje JavaScript, takie jak V8 (Chrome), SpiderMonkey (Firefox) i Chakra (IE / Edge) mają kompilację JIT i szereg innych optymalizacji w celu poprawy wydajności.

Dlaczego Python ich nie ma?

Patrzyłem na PyPy i IronPython, które oba twierdzą, że zyskują prędkość. PyPy Nie rozumiem, jak implementacja Pythona napisana w Pythonie, interpretowanym języku, będzie szybsza niż referencyjna implementacja w C. IronPython, ten sam pomysł, ale nie widzę, jak .NET Framework zwiększy szybkość.

Sójka
źródło
2
IronPython - jak każdy inny język .NET - jest kompilowany do Microsoft Common Intermediate Language, dla którego istnieją bardzo dojrzałe implementacje kompilatora JIT.
Doc Brown
2
Język programowania to specyfikacja (napisana w niektórych dokumentach), a nie oprogramowanie. Jedynie implementacje języka programowania są oprogramowaniem (i mogą być kompilatorami lub tłumaczami).
Basile Starynkevitch 27.04.17
1
@BasileStarynkevitch: Nie rozumiem tego, co próbujesz nam powiedzieć w tym komentarzu. OP pyta wprost o CPython, PyPy i IronPython, które specyficznymi implementacjami Pythona.
Doc Brown
1
@DocBrown Wydaje się, że należy podnieść odpowiedni punkt, biorąc pod uwagę ostatni akapit pytania, który pokazuje nieporozumienie, gdy konkretnie nazywa Python tłumaczonym językiem.
8bittree 27.04.17

Odpowiedzi:

19

Dlaczego Python ich nie ma?

Nie jestem pewien, dlaczego uważasz, że nie ma implementacji Python, które dbają o wydajność. PyPy , IronPython i Jython są przemysłowymi, gotowymi do wdrożenia implementacjami Python, które dbają o wydajność. Pyston to implementacja w fazie rozwoju, która została stworzona specjalnie z myślą o wydajności. Unladen Swallow i Psyco to także projekty mające na celu poprawę wydajności Pythona.

Jednak fakt, że użytkownicy CPython znacznie przewyższają całkowitą łączną bazę użytkowników wszystkich innych wdrożeń, że społeczność Unladen Swallow została odrzucona przez społeczność, że większość z tych projektów jest martwa lub stara się przyciągnąć programistów, powinna powiedzieć coś o tym, jak Python społeczność ceni wydajność.

Ta odpowiedź jest dobrym przykładem typowej mentalności społeczności Python: zamiast naprawiać problemy z wydajnością, woleliby po prostu pisać swój kod poza Pythonem.

Patrzyłem na PyPy i IronPython, które oba twierdzą, że zyskują prędkość. PyPy Nie rozumiem, w jaki sposób implementacja Pythona napisana w Pythonie, języku interpretowanym, będzie szybsza niż implementacja referencyjna w C.

Po pierwsze: nie ma znaczenia, w jakim języku jest napisany kompilator. W końcu kompilator jest uruchamiany tylko raz , więc nawet jeśli był powolny, to nie ma znaczenia: wydajność kompilatora nie ma znaczenia, co jest istotne to wydajność danych wyjściowych kompilatora.

Po drugie, ponieważ ma znaczenie tylko to, jak szybkie jest wyjście kompilatora, a kompilator jest napisany w Pythonie, tj. Języku, który kompiluje, może się sam szybko skompilować.

Po trzecie, nie ma czegoś takiego jak „język interpretowany”. Język to zbiór zasad i ograniczeń matematycznych. To specyfikacja. Kartka papieru. Język nie jest kompilowany ani interpretowany. Po prostu jest język . Kompilacja i interpretacja są cechami implementacji języka , a dokładniej kompilatora lub tłumacza (duh!), A nie języka. Każdy język może być implementowany przez kompilator. Tłumacz może zaimplementować każdy język. Możesz mechanicznie wygenerować kompilator z interpretera i interpretera z kompilatora.

Ale to wszystko tak naprawdę nie ma znaczenia, ponieważ PyPy nie jest napisane w Pythonie. Jest napisany w RPython . RPython składa się z dwóch części: języka programowania RPython i frameworku RPython.

Językiem programowania RPython nie jest Python. To inny język programowania. RPython jest statycznym typem języka programowania, mniej więcej na tym samym poziomie abstrakcji co Java, z mniej więcej taką samą wydajnością jak C. RPython jest składniowym i semantycznym podzbiorem Pythona, co oznacza, że ​​każdy program RPython jest prawidłowym programem w Pythonie i może być uruchamiany przez implementację Pythona (choć zwykle kilka rzędów wielkości wolniej, ale nadal jest to przydatne do debugowania, ponieważ masz dostęp do wszystkich narzędzi Pythona, a tłumaczenie rozpoczyna się od razu, podczas gdy kompilacja implementacji języka zwykle zajmuje około 5-10 minut ), ale odwrotność nie jest prawdą.

Framework RPython jest strukturą do pisania wysokowydajnych implementacji dynamicznego języka w języku programowania RPython. Obejmuje moduł wyrzucania elementów bezużytecznych, przestrzeń obiektową, protokół metaobiektu, predefiniowane obiekty, typy i operacje itd. Klejnotem koronnym jest jego zdolność do automatycznego generowania kompilatora JIT z interpretera: jeśli zaimplementujesz język w frameworku RPython, wystarczy napisać interpreter, frameworkiem RPython zajmie się JIT.

Istnieje wiele implementacji językowych na platformie RPython , nie tylko PyPy.

IronPython, ten sam pomysł, ale nie widzę, jak .NET Framework zwiększy prędkość.

Większość implementacji interfejsu wiersza polecenia ISO, takich jak różne warianty .NET firmy Microsoft lub Mono, zawierają zaawansowane moduły zbierające śmieci, optymalizatory i kompilatory. To samo dotyczy implementacji Jython i Java.

IronPython jest kompilatorem, kompiluje kod źródłowy Pythona do drzew DLR (DLR to Dynamic Language Runtime), które są następnie kompilowane do kodu bajtowego CIL, który następnie jest zwykle dalej kompilowany do natywnego kodu maszynowego.

Jörg W Mittag
źródło
6

Nowoczesne implementacje JavaScript, takie jak V8 (Chrome), SpiderMonkey (Firefox) i Chakra (IE / Edge) mają kompilację JIT i szereg innych optymalizacji w celu poprawy wydajności.

Dlaczego Python ich nie ma?

JavaScript jest zawarty w przeglądarkach internetowych, a znaczna część oprogramowania jest obecnie przeznaczona do działania w przeglądarkach internetowych. To sprawia, że ​​wydajność JavaScript jest bardzo ważna, dzięki czemu firmy takie jak Google, Apple i Microsoft inwestują wiele zasobów w szybkie uruchamianie skryptów JavaScript. Gdyby ten strumień pieniędzy został przekierowany do Pythona, byłby równie szybki.

PyPy Nie rozumiem, w jaki sposób implementacja Pythona napisana w Pythonie, języku interpretowanym, będzie szybsza niż implementacja referencyjna w C.

Chodzi o to, że gdy kod jest edytowany w JIT, nie jest już „interpretowany”. PyPI działa poprzez przekształcenie kodu Pythona w kod maszynowy (np. Kod maszynowy x86_64), który jest następnie wykonywany bezpośrednio na procesorze.

el.pescado
źródło
3
Szczególnie istotne jest to, że w przeglądarce internetowej nie ma alternatywy dla JavaScript (a przynajmniej nic ogólnie dostępnego we wszystkich głównych przeglądarkach). Jeśli chcesz mieć wysoką wydajność w przeglądarce internetowej, musisz mieć szybką implementację JavaScript. Natomiast na platformach z Pythonem prawie na pewno można przejść na inny język, który może mieć lepszą wydajność.
8bittree 27.04.17
-3

Jeśli utworzysz kod Pythona w moduły z prostym uruchomieniem najwyższego poziomu jako główny plik Pythona (z bardzo małą ilością kodu), to Python skompiluje resztę kodu w niezależny od maszyny kod bajtowy, są to: Pliki .pyc widoczne w strukturze katalogów. Minimalizuje to czas ładowania i interpretacji po pierwszym uruchomieniu.

Jeśli uruchomisz skrypt z flagami -O lub -OO lub ustawisz PYTHONOPTIMIZE na wartość większą niż 0, generowane są pliki .pyo, które są dalej optymalizowane.

Jeśli potrzebujesz wysokiej optymalizacji dla niektórych określonych funkcji, możesz napisać je w C, C ++, FORTRAN lub GO, a następnie użyć ich z poziomu Pythona.

Steve Barnes
źródło
Jak zintegrować rozszerzenia inne niż C w Pythonie? Wiem tylko o rozszerzeniach C dla Cython.
1
@Bey: Zasadniczo wszystko w bibliotece współdzielonej (.dll lub .so) można wywoływać z pythona, pod warunkiem, że znasz sygnatury funkcji - można je skonfigurować ręcznie, generowane przez narzędzia takie jak swing, a nawet generowane z dokumentacji Doksygen. stackoverflow.com/questions/5811949/... jest pomocny, podobnie jak blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes