2013-05-27 13 views
9

Znam różnicę między plikiem .py i .pyc. Moje pytanie brzmi nie o jak, ale o dlaczego Według docs:Dlaczego "uruchamianie" plików .pyc nie jest szybsze w porównaniu z plikami .py?

Program nie prowadzi się szybciej, gdy jest czytana z .pyc lub .pyo plik niż kiedy jest czytany z pliku .py; jedyną rzeczą, która jest szybsza w plikach .pyc lub .pyo, jest szybkość, z jaką są ładowane .

. Pliki pyc ładują import szybciej. Ale po załadowaniu "działającej" części plików .pyc zajmuje tyle samo czasu co "działająca" część w plikach .py? Dlaczego to jest? Chciałbym się spodziewać, że

  • Kod bitowy (.pyc) jest bliżej do Pythona Virtual Machine, a tym samym działa szybciej
  • .py pliki są kompilowane do .pyc zanim są one wykonywane. To wymaga dodatkowego kroku, a tym samym kosztuje czas.

Moje pytanie: po części importowania, dlaczego działająca część plików .pyc nie przyspiesza wykonywania w porównaniu z plikami .py?

Odpowiedz

16

Po uruchomieniu pliku .py jest on najpierw kompilowany do kodu bajtowego, a następnie wykonywany. Załadowanie takiego pliku jest wolniejsze, ponieważ dla etapu .pyc etap kompilacji został już wykonany, ale po załadowaniu wykonywana jest ta sama interpretacja kodu bajtowego.

W Pseudokod, interpreter Pythona wykonuje następujący algorytm:

code = load(path) 
if path.endswith(".py"): 
    code = compile(code) 
run(code) 
+0

Głupi, oczywiście. Dzięki. – OrangeTux

+0

Aby skompilować plik .py programowo: import py_compile py_compile.compile ('Hello.py') - to generuje Hello_cpython-36.pyc (na podstawie realizacji używanego) – maris

10

Sposób programy są run jest zawsze taka sama. Skompilowany kod jest interpretowany.

Sposób, w jaki programy są załadowany różni się. Jeśli istnieje aktualny plik pyc, jest on traktowany jako wersja skompilowana, więc nie trzeba wykonywać kroku kompilacji przed uruchomieniem tego polecenia. W przeciwnym razie odczytany zostanie plik py, kompilator musi go skompilować (co zajmuje trochę czasu), ale wtedy skompilowana wersja w pamięci jest interpretowana tak, jak w inny sposób.

Powiązane problemy