Dlaczego miałbyś skompilować skrypt Pythona? Możesz uruchomić je bezpośrednio z pliku .py i działa dobrze, więc czy istnieje przewaga wydajności czy coś takiego?
Zauważyłem również, że niektóre pliki w mojej aplikacji są kompilowane do pliku .pyc, podczas gdy inne nie, dlaczego?
python
compilation
ryeguy
źródło
źródło
import mylib.py
, Python skompiluje sięmylib.py
, aby przyszłeimport
instrukcje działały nieco szybciej. Jeśli później zmieniszmylib.py
, to przy następnym importowaniu zostanie ponownie skompilowana (Python używa daty pliku, aby zobaczyć, że tak się dzieje.)Odpowiedzi:
Jest skompilowany do kodu bajtowego, którego można używać znacznie, znacznie, znacznie szybciej.
Powodem, dla którego niektóre pliki nie są kompilowane, jest to, że skrypt główny, który wywołujesz,
python main.py
jest rekompilowany przy każdym uruchomieniu skryptu. Wszystkie importowane skrypty zostaną skompilowane i zapisane na dysku.Ważny dodatek Ben Blank :
źródło
Plik .pyc to Python, który został już skompilowany do kodu bajtowego. Python automatycznie uruchamia plik .pyc, jeśli znajdzie plik o takiej samej nazwie jak wywoływany plik .py.
„Wprowadzenie do Pythona” mówi o skompilowanych plikach Python:
Zaletą uruchamiania pliku .pyc jest to, że Python nie musi ponosić kosztów kompilacji przed uruchomieniem. Ponieważ Python skompilowałby się do kodu bajtowego przed uruchomieniem pliku .py, nie powinno być żadnej poprawy wydajności.
Ile ulepszeń można uzyskać, korzystając ze skompilowanych plików .pyc? To zależy od tego, co robi skrypt. W przypadku bardzo krótkiego skryptu, który po prostu wypisuje „Hello World”, kompilacja może stanowić duży procent całkowitego czasu uruchamiania i uruchamiania. Ale koszt skompilowania skryptu w stosunku do całkowitego czasu pracy zmniejsza się w przypadku dłuższych skryptów.
Skrypt, który nazwiesz w wierszu polecenia, nigdy nie jest zapisywany w pliku .pyc. Tylko moduły ładowane przez ten „główny” skrypt są zapisywane w ten sposób.
źródło
Plusy:
Po pierwsze: łagodne, możliwe do pokonania zaciemnienie.
Po drugie: jeśli kompilacja spowoduje znacznie mniejszy plik, otrzymasz krótszy czas ładowania. Ładne dla sieci.
Po trzecie: Python może pominąć krok kompilacji. Szybszy przy początkowym obciążeniu. Ładne dla procesora i sieci.
Po czwarte: im więcej komentujesz, tym mniejszy jest plik
.pyc
lub.pyo
w porównaniu do źródła.py
pliku .Po piąte: użytkownik końcowy posiadający tylko a
.pyc
lub.pyo
plik w ręku, znacznie rzadziej przedstawia ci błąd, który spowodował przez nieodwróconą zmianę, o której zapomniał ci powiedzieć.Po szóste: jeśli dążysz do systemu osadzonego, uzyskanie mniejszego rozmiaru pliku do osadzenia może stanowić znaczący plus, a architektura jest stabilna, więc wada, opisana poniżej, nie wchodzi w grę.
Kompilacja na najwyższym poziomie
Warto wiedzieć, że można skompilować plik źródłowy Pythona najwyższego poziomu do
.pyc
pliku w ten sposób:To usuwa komentarze. Pozostawia
docstrings
nietknięty. Jeśli chcesz się tego pozbyćdocstrings
(możesz poważnie zastanowić się, dlaczego to robisz), a następnie skompiluj w ten sposób ...... a otrzymasz
.pyo
plik zamiast.pyc
pliku; równomiernie dystrybuowany pod względem podstawowej funkcjonalności kodu, ale mniejszy ze względu na rozmiar okrojonydocstrings
(i mniej zrozumiały dla późniejszego zatrudnienia, gdyby był przyzwoitydocstrings
). Ale patrz wada trzecia poniżej.Zauważ, że Python używa daty
.py
pliku, jeśli jest obecny, aby zdecydować, czy powinien on wykonać.py
plik, a nie plik.pyc
lub.pyo
--- - więc edytuj plik .py, a.pyc
lub.pyo
jest przestarzały, a wszelkie korzyści, które uzyskałeś, zostaną utracone. Musisz go ponownie skompilować, aby ponownie odzyskać korzyści.pyc
lub.pyo
korzyści, takie jak mogą być.Wady:
Po pierwsze: istnieje „magiczne ciasteczko”
.pyc
i.pyo
pliki, które wskazują architekturę systemu, w której skompilowano plik python. Jeśli rozpowszechnisz jeden z tych plików w środowisku innego typu, ulegnie on awarii. Jeśli dystrybuujesz plik skojarzony.pyc
lub.pyo
bez niego w.py
celu ponownej kompilacjitouch
, zastępuje on.pyc
lub.pyo
, użytkownik końcowy również nie może go naprawić.Po drugie: jeśli
docstrings
zostaną pominięte przy użyciu-OO
opcji wiersza polecenia, jak opisano powyżej, nikt nie będzie w stanie uzyskać tych informacji, co może utrudnić (lub uniemożliwić) użycie kodu.Po trzecie:
-OO
opcja Pythona implementuje również pewne optymalizacje zgodnie z-O
opcją wiersza poleceń; może to spowodować zmiany w działaniu. Znane optymalizacje to:sys.flags.optimize
= 1assert
instrukcje są pomijane__debug__
= FałszPo czwarte: jeśli celowo sprawiłeś, że twój skrypt Pythona jest wykonywalny z czymś w kolejności
#!/usr/bin/python
w pierwszym wierszu, zostanie on rozebrany.pyc
i.pyo
pliki, a funkcjonalność zostanie utracona.Po piąte: nieco oczywiste, ale jeśli skompilujesz swój kod, nie tylko wpłynie to na jego użycie, ale również zmniejszy, często poważnie, możliwość uczenia się z pracy przez innych.
źródło
Zwiększono wydajność uruchamiania skompilowanego Pythona. Jednak gdy uruchomisz plik .py jako zaimportowany moduł, python skompiluje go i zapisze, i dopóki plik .py się nie zmieni, zawsze będzie korzystał ze skompilowanej wersji.
W przypadku dowolnego interpetowanego języka, 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 używając wstępnie skompilowanego kodu możesz wyeliminować krok 2, dotyczy to Pythona, PHP i innych.
Oto interesujący post 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
źródło
Jak już wspomniano, można uzyskać wzrost wydajności dzięki kompilacji kodu Pythona w kodzie bajtowym. Zwykle jest to obsługiwane przez sam python, tylko dla importowanych skryptów.
Innym powodem, dla którego warto skompilować kod Pythona, może być ochrona własności intelektualnej przed kopiowaniem i / lub modyfikacją.
Możesz przeczytać więcej na ten temat w dokumentacji Pythona .
źródło
Z pewnością istnieje różnica w wydajności podczas uruchamiania skompilowanego skryptu. Jeśli uruchamiasz normalne
.py
skrypty, maszyna kompiluje je za każdym razem, gdy jest uruchamiane, a to zajmuje dużo czasu. Na nowoczesnych maszynach jest to prawie niezauważalne, ale wraz ze wzrostem skryptu może to stać się większym problemem.źródło
Coś, czego nie poruszono, to kompilacja między źródłami . Na przykład,
nuitka
tłumaczy kod Pythona na C / C ++ i kompiluje go do kodu binarnego, który działa bezpośrednio na procesorze, 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 ++.
źródło
Używamy skompilowanego kodu do rozpowszechniania wśród użytkowników, którzy nie mają dostępu do kodu źródłowego. Zasadniczo, aby powstrzymać niedoświadczonych programistów przypadkową zmianą lub naprawą błędów bez informowania nas.
źródło
Tak, wydajność jest głównym powodem i, o ile wiem, jedynym powodem.
Jeśli niektóre pliki nie są kompilowane, być może Python nie może zapisać do pliku .pyc, być może z powodu uprawnień do katalogu lub czegoś takiego. A może nieskompilowane pliki po prostu nigdy się nie ładują ... (skrypty / moduły kompilują się dopiero przy pierwszym załadowaniu)
źródło
Początkujący zakładają, że Python jest kompilowany z powodu plików .pyc. Plik .pyc jest skompilowanym kodem bajtowym, który jest następnie interpretowany. Jeśli więc wcześniej uruchomiłeś kod Python i masz pod ręką plik .pyc, uruchomi się on szybciej za drugim razem, ponieważ nie musi ponownie kompilować kodu bajtowego
kompilator: kompilator to fragment kodu, który tłumaczy język wysokiego poziomu na język maszynowy
Tłumacze: Tłumacze konwertują również język wysokiego poziomu na binarne odpowiedniki do odczytu maszynowego. Za każdym razem, gdy interpreter otrzymuje kod języka wysokiego poziomu, który ma zostać wykonany, konwertuje kod na kod pośredni przed konwersją na kod maszynowy. Każda część kodu jest interpretowana, a następnie wykonywana osobno w sekwencji, a błąd znajduje się w części kodu, zatrzyma on 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
źródło