Dlaczego kompilować Kod Pythona?

Dlaczego kompilujesz skrypt Pythona? Możesz je uruchomić bezpośrednio z pliku. py i działa dobrze, więc czy jest jakaś zaleta wydajności czy coś?

Zauważyłem również, że niektóre pliki w mojej aplikacji są kompilowane do .pyc podczas gdy inni nie, dlaczego tak jest?

Author: random, 2009-01-23

10 answers

Jest skompilowany do kodu bajtowego, który może być używany dużo, dużo, dużo szybciej.

Powodem, dla którego niektóre pliki nie są kompilowane, jest to, że skrypt główny, który wywołujesz za pomocą python main.py jest rekompilowany za każdym razem, gdy uruchomisz skrypt. Wszystkie zaimportowane Skrypty zostaną skompilowane i zapisane na dysku.

ważny dodatek Ben Blank:

Warto zauważyć, że podczas prowadzenia skompilowany skrypt ma szybsze uruchamianie czas (bo nie musi być skompilowany), nie uruchamia żadnego szybciej.

 229
Author: Georg Schölly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:44

The .plik pyc to Python, który został już skompilowany do kodu bajtowego. Python automatycznie uruchamia a .plik pyc, jeśli znajdzie plik o tej samej nazwie, co wywołany plik .py.

"Wprowadzenie do Pythona" mówi to o skompilowanych plikach Pythona:

Program nie działa szybciej, gdy czyta się od a '.pyc "lub".pyo" plik niż gdy jest odczytywany z'. py' plik; jedyna rzecz, która jest szybsza o".pyc "lub".pliki pyo to szybkość z jaką są naładowane.

Zaleta prowadzenia a .plik pyc jest taki, że Python nie musi ponosić kosztów kompilacji przed uruchomieniem. Ponieważ Python skompilowałby się do kodu bajtowego przed uruchomieniem pliku .py, poza tym nie powinno być żadnej poprawy wydajności.

Jak wiele poprawy można uzyskać dzięki użyciu skompilowanego .pliki pyc? To zależy od tego, co zrobi skrypt. Dla bardzo krótkiego skryptu, który po prostu drukuje "Hello World", kompilacja może stanowić dużą procent całkowitego czasu uruchamiania i uruchamiania. Jednak koszt kompilacji skryptu w stosunku do całkowitego czasu wykonywania zmniejsza się w przypadku skryptów dłużej działających.

Skrypt, który nazwałeś w wierszu poleceń, nigdy nie zostanie zapisany do a .plik pyc. Tylko Moduły załadowane przez ten skrypt "main" są zapisywane w ten sposób.

 72
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 23:14:33

Plusy:

Pierwszy: łagodne, pokonane zaciemnienie.

Po drugie: jeśli kompilacja spowoduje znacznie mniejszy plik, uzyskasz krótszy czas ładowania. Miło w sieci.

Po Trzecie: Python może pominąć krok kompilacji. Szybciej przy obciążeniu wewnętrznym. Ładne dla CPU i sieci.

Po czwarte: im więcej komentujesz, tym mniejszy będzie plik .pyc lub .pyo w porównaniu do pliku źródłowego .py.

Po piąte: użytkownik końcowy posiadający tylko .pyc lub .pyo file in hand jest znacznie mniej prawdopodobne, aby przedstawić Ci błąd, który został spowodowany przez nieodwróconą zmianę, o której zapomnieli ci powiedzieć.

Po szóste: jeśli celujesz w system wbudowany, uzyskujesz mniejszy rozmiar plik do osadzenia może stanowić znaczący plus, a architektura jest stabilna, więc wada, opisana poniżej, nie wchodzi w grę.

Top level compilation

Warto wiedzieć, że można skompilować plik źródłowy Pythona najwyższego poziomu do .pyc plik w ten sposób:

python -m py_compile myscript.py

To usuwa komentarze. Pozostawia docstrings nienaruszone. Jeśli chcesz również pozbyć się docstrings (możesz poważnie pomyśleć o tym, dlaczego to robisz), skompiluj w ten sposób...

python -OO -m py_compile myscript.py

...i otrzymasz plik .pyo zamiast pliku .pyc; równie dystrybuowalny pod względem zasadniczej funkcjonalności kodu, ale mniejszy o rozmiar usuniętego docstrings (i mniej zrozumiały dla późniejszego zatrudnienia, jeśli miał przyzwoite docstrings na pierwszym miejscu). Ale patrz wada trzecia, poniżej.

Zauważ, że python używa daty Pliku .py, jeśli jest obecny, aby zdecydować, czy powinien wykonać plik .py w przeciwieństwie do pliku .pyc lub .pyo - więc Edytuj swój plik .py, a .pyc lub .pyo jest przestarzały i wszelkie korzyści, które uzyskałeś, zostaną utracone. Musisz go przekompilować, aby uzyskać .pyc lub .pyo Korzyści z powrotem, takie, jakie mogą być.

Wady:

Pierwszy: W plikach .pyc i .pyo znajduje się" magiczne ciasteczko", które wskazuje na architekturę systemu, w której skompilowano plik Pythona. Jeśli rozpowszechnisz jeden z tych plików w środowisku innego typu, pęknie. Jeśli rozpowszechniasz .pyc lub .pyo bez powiązanego .py, Aby przekompilować lub touch, więc zastępuje on .pyc lub .pyo, Użytkownik końcowy również nie może tego naprawić.

Po drugie: jeśli docstrings zostaną pominięte przy użyciu opcji linii poleceń -OO, jak opisano powyżej, nikt będzie w stanie uzyskać na te informacje, które mogą uczynić korzystanie z kodu trudniejsze (lub niemożliwe.)

Po Trzecie: opcja -OO w Pythonie implementuje również pewne optymalizacje zgodnie z opcją linii poleceń -O; może to spowodować zmiany w działaniu. Znane optymalizacje to:

  • sys.flags.optimize = 1
  • assert wypowiedzi są pomijane
  • __debug__ = False

Po czwarte: jeśli celowo wykonywalny skrypt Pythona z czymś na kolejność #!/usr/bin/python w pierwszej linii jest ona usuwana w plikach .pyc i .pyo i ta funkcjonalność jest tracona.

Po piąte: dość oczywiste, ale jeśli skompilujesz swój kod, nie tylko jego użycie może mieć wpływ, ale potencjał uczenia się przez innych z twojej pracy jest ograniczony, często poważnie.

 35
Author: fyngyrz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 18:17:23

Jest wzrost wydajności w uruchomieniu skompilowanego Pythona. Jednak gdy uruchomisz plik .py jako zaimportowany moduł, python skompiluje go i zapisze i tak długo, jak plik .py nie zmieni się, zawsze będzie używał skompilowanej wersji.

W dowolnym języku interpetowanym, gdy plik jest używany, proces wygląda mniej więcej tak:
1. Plik jest przetwarzany przez interpeter.
2. Plik jest kompilowany
3. Skompilowany kod jest wykonywany.

Oczywiście za pomocą wstępnie skompilowanych kod można wyeliminować Krok 2, dotyczy to Pythona, PHP i innych.

Oto ciekawy wpis na blogu wyjaśniający różnice http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
A oto wpis, który wyjaśnia proces kompilacji Pythona http://effbot.org/zone/python-compile.htm

 9
Author: UnkwnTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 17:56:06

Istnieje z pewnością różnica w wydajności podczas uruchamiania skompilowanego skryptu. Jeśli uruchomisz normalne Skrypty .py, maszyna kompiluje je za każdym razem, gdy jest uruchamiana, a to wymaga czasu. Na nowoczesnych maszynach jest to mało zauważalne, ale wraz z rozwojem skryptu może to stać się większym problemem.

 7
Author: matpie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 23:02:39

Jak już wspomniano, możesz uzyskać wzrost wydajności dzięki kompilacji kodu Pythona do kodu bajtowego. Jest to zwykle obsługiwane przez sam python, tylko dla importowanych skryptów.

Innym powodem, dla którego możesz chcieć skompilować swój kod Pythona, może być ochrona twojej własności intelektualnej przed kopiowaniem i/lub modyfikacją.

Możesz przeczytać więcej na ten temat w dokumentacji Pythona .

 7
Author: Simon B. Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 23:09:53

Używamy skompilowanego kodu do dystrybucji dla użytkowników, którzy nie mają dostępu do kodu źródłowego. Zasadniczo, aby zatrzymać niedoświadczonych programistów przypadkowo zmieniających coś lub naprawiających błędy, nie mówiąc nam o tym.

 3
Author: DrBwts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 16:14:32

Tak, wydajność jest głównym powodem i, o ile wiem, jedynym powodem.

Jeśli niektóre z Twoich plików nie są kompilowane, może Python nie jest w stanie napisać do .plik pyc, być może z powodu uprawnień do katalogów lub czegoś takiego. A może nieskompilowane pliki nigdy nie są ładowane... (Skrypty/moduły są kompilowane tylko po pierwszym załadowaniu)

 2
Author: David Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 23:03:58

Początkujący zakładają, że Python jest kompilowany z powodu .pliki pyc. The .plik pyc jest skompilowanym kodem bajtowym, który jest następnie interpretowany. Więc jeśli uruchomiłeś swój kod Pythona wcześniej i masz .plik pyc jest poręczny, za drugim razem będzie działał szybciej, ponieważ nie musi ponownie kompilować kodu bajtowego

Kompilator: Kompilator jest fragmentem kodu, który tłumaczy język wysokiego poziomu na język maszynowy

Interpretatorzy: Tłumacze również konwertują język wysokiego poziomu do maszynowych odpowiedników binarnych. Za każdym razem, gdy interpreter otrzymuje kod języka wysokiego poziomu do wykonania, konwertuje kod na kod pośredni przed konwersją go na kod maszynowy. Każda część kodu jest interpretowana, a następnie wykonywana oddzielnie w sekwencji i błąd znajduje się w części kodu, który zatrzyma interpretację kodu bez tłumaczenia następnego zestawu kodów.

Źródła: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter

 1
Author: Beginner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 14:13:34

Coś, czego nie poruszyliśmy, to kompilowanie source-to-source-compiling . Na przykład nuitka tłumaczy Kod Pythona na C / C++ i kompiluje go do kodu binarnego, który działa bezpośrednio na CPU, zamiast kodu bajtowego Pythona, który działa na wolniejszej maszynie wirtualnej.

Może to prowadzić do znacznego przyspieszenia lub pozwoli Ci pracować z Pythonem, podczas gdy twoje środowisko zależy od kodu C / C++.

 1
Author: user258532,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-23 19:30:11