What are the implications of running python with the optimize flag?

Question:

What does Python do differently when running with the -O (optimize) flag?

Asked By: kkubasik

||

Answers:

assert statements are completely eliminated, as are statement blocks of the form if __debug__: ... (so you can put your debug code in such statements blocks and just run with -O to avoid that debug code).

With -OO, in addition, docstrings are also eliminated.

Answered By: Alex Martelli

From the docs:

  • You can use the -O or -OO switches on the Python command to reduce the size of a compiled module. The -O switch removes assert statements, the -OO switch removes both assert statements and __doc__ strings. Since some programs may rely on having these available, you should only use this option if you know what you’re doing. “Optimized” modules have an opt- tag and are usually smaller. Future releases may change the effects of optimization.
  • A program doesn’t run any faster when it is read from a .pyc file than when it is read from a .py file; the only thing that’s faster about .pyc files is the speed with which they are loaded.

So in other words, almost nothing.

Answered By: ire_and_curses

From What does the -O flag do?

It somewhat depends on the Python
version. To find out precisely what it
does, search the source code for
Py_OptimizeFlag. In 2.5, it

  • causes the interpreter to load .pyo files, not .pyc files (in .zip files,
    just makes .pyo preferred over .pyc)
  • causes __debug__ to have a value of 0
  • ignores assert statements in source code
  • treats __debug__ statically as being 0
  • causes the byte code generator to save .pyo files, not .pyc
Answered By: joaquin

As answered in python optimization mode:

python -O does the following currently:

  • completely ignores asserts
  • sets the special builtin name __debug__ to False (which by default is True)

and when called as python -OO

  • removes docstrings from the code

I don’t know why everyone forgets to mention the __debug__ issue; perhaps it is because I’m the only one using it 🙂 An if __debug__ construct creates no bytecode at all when running under -O, and I find that very useful.

Answered By: tzot
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.