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ść.
python-3.x
jit
Sójka
źródło
źródło
Odpowiedzi:
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.
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.
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.
źródło
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.
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.
źródło
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.
źródło