2013-05-27 23 views
9

Conosco la differenza tra un file .py e .pyc. La mia domanda è non su come, ma circa perché Secondo il docs:Perché la 'esecuzione' dei file .pyc non è più veloce rispetto ai file .py?

Un programma non viene eseguito più velocemente quando viene letto da un .pyc o .pyo di file rispetto a quando viene letto da un file .py; l'unica cosa che è più veloce sui file .pyc o .pyo è la velocità con cui sono caricati .

.pyc caricare le importazioni più velocemente. Ma dopo aver caricato la parte "in esecuzione" dei file .pyc, viene utilizzata la stessa parte "in esecuzione" nei file .py? Perché è questo? Mi aspettavo che il codice

  • bit (.pyc) è più vicina alla macchina virtuale di Python e corre quindi più veloce
  • file .py vengono compilati a .pyc prima che siano in corso di esecuzione. Questo richiede un passo in più e quindi costa tempo.

La mia domanda: Dopo la parte di importazione, perché la parte in esecuzione dei file .pyc non velocizza l'esecuzione rispetto ai file .py?

risposta

16

Quando si esegue un file .py, questo viene prima compilato in bytecode, quindi eseguito. Il caricamento di tale file è più lento perché per un .pyc, la fase di compilazione è già stata eseguita, ma dopo il caricamento, viene eseguita la stessa interpretazione bytecode.

In pseudocodice, l'interprete Python esegue il seguente algoritmo:

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

Stupido, certo. Grazie. – OrangeTux

+0

per compilare un file .py di programmazione: import py_compile py_compile.compile ('Hello.py') - questo genera Hello_cpython-36.pyc (basata sulla realizzazione che si sta utilizzando) – maris

10

Il modo in cui i programmi sono corsa è sempre lo stesso. Il codice compilato è interpretato.

Il modo in cui i programmi sono caricato differisce. Se esiste un file corrente pyc, questo viene preso come versione compilata, quindi non è necessario eseguire alcun passo di compilazione prima di eseguire il comando. Altrimenti viene letto il file py, il compilatore deve compilarlo (che richiede un po 'di tempo), ma la versione compilata in memoria viene interpretata come nell'altro modo.