2011-01-23 13 views
36

I documenti dicono solo che l'interprete Python esegue "ottimizzazioni di base", senza entrare nei dettagli. Ovviamente, dipende dall'implementazione, ma c'è un modo per avere un'idea di quale tipo di cose potrebbero essere ottimizzate e di quanti risparmi in termini di runtime potrebbero generare?Cosa fa l'ottimizzazione Python (-O o PYTHONOPTIMIZE)?

C'è qualche svantaggio nell'usare -O?

L'unica cosa che so è che -O disabilita assert, ma presumibilmente non si dovrebbe usare assert per cose che potrebbero ancora andare storte in produzione.

+1

possibile duplicato di [Qual è l'uso di modalità di ottimizzazione di base di Python? ('python -O')] (http://stackoverflow.com/questions/1693088/what-is-the-use-of-pythons-basic-optimizations-mode-python-o) – tzot

risposta

45

In Python 2.7, -O ha il seguente effetto:

Inoltre -OO h come il seguente effetto:

Per verificare l'effetto di un diverso rilascio di CPython, Grep il codice sorgente per Py_OptimizeFlag.

link di documentazione ufficiale: https://docs.python.org/2.7/tutorial/modules.html#compiled-python-files

+1

C'è qualche lato negativo al -O flag a parte la mancanza delle informazioni di debug integrate? – max

+7

Ho visto molti moduli python che accettano docstring sono disponibili e si interrompono se viene utilizzato quel livello di ottimizzazione, ad esempio presso la società in cui lavoro, sql raw viene inserito in docstrings ed eseguito tramite decoratori di funzioni (nemmeno prendere in giro). Un po 'meno frequentemente, 'assert' è usato per eseguire funzioni logiche, piuttosto che dichiarare semplicemente le aspettative invarianti di un punto nel codice, e quindi qualsiasi codice come quello si spezzerebbe. – SingleNegationElimination

+1

@max: se passi alla lista completa delle modifiche semantiche di cui sopra: consideri uno di loro uno "svantaggio"? In caso contrario, non ci sono aspetti negativi. Personalmente considero uno svantaggio il fatto che il nome dei file del codice byte cambi, contribuisce al disordine del disco. Si noti che "le informazioni di debug incorporate mancanti" non * sono * nell'elenco; pdb continua a funzionare bene (questo non era il caso nelle precedenti versioni di Python, dove -O cadeva il supporto per single-stepping in pdb). –