50

-OPython には、インタープリターを実行できるフラグがあります。このオプションは「最適化された」バイトコード (.pyo ファイルに書き込まれる) を生成し、2 回指定すると、docstring を破棄します。Python の man ページから:

-O 基本的な最適化をオンにします。これにより、コンパイル済み (バイトコード) ファイルのファイル名拡張子が .pyc から .pyo に変更されます。2 回指定すると、docstring が破棄されます。

このオプションの 2 つの主要な機能は次のとおりです。

  • すべての assert ステートメントを取り除きます。これは、破損したプログラム状態に対する防御と速度を交換します。しかし、違いを生むために大量の assert ステートメントが必要ではないでしょうか? これが価値のある(そして正気の)コードはありますか?

  • すべての docstring を取り除きます。メモリ使用量が非常に重要で、これが成功するアプリケーションはどれですか? すべてを C で書かれたモジュールに入れてみませんか?

このオプションの用途は何ですか? それは現実世界の価値を持っていますか?

4

7 に答える 7

49

-Oフラグのもう1つの使用法は、__debug__組み込み変数の値がに設定されることFalseです。

したがって、基本的に、コードには次のような多くの「デバッグ」パスを含めることができます。

if __debug__:
     # output all your favourite debugging information
     # and then more

の下で実行すると、ファイル-Oにバイトコードとして含まれることさえありません。.pyo貧乏人のCっぽい#ifdef。

docstringは、フラグが。の場合にのみ-OO削除されることに注意してください。

于 2009-11-08T22:35:40.063 に答える
32

assert ステートメントの削除について: これは、C の世界では標準的なオプションです。多くの人々は、ASSERT の定義の一部が製品コードでは実行されないと考えています。それらを取り除くかどうかに違いがあるかどうかは、アサートがどれだけの作業を行うかよりも、アサートの数に依存します。

def foo(x):
    assert x in huge_global_computation_to_check_all_possible_x_values()
    # ok, go ahead and use x...

もちろん、ほとんどのアサーションはそのようなものではありませんが、そのようなことができることを覚えておくことが重要です。

docstring の削除に関しては、単純な時代からの風変わりな名残のように思えますが、メモリに制約のある環境では違いが生じる可能性があると思います。

于 2009-11-07T14:07:25.173 に答える
8

頻繁に呼び出されるコード (内側のループなど) にアサーションがある場合、それらを削除すると確かに違いが生じます。極端な例:

$ python    -c 'import timeit;print timeit.repeat("assert True")'
[0.088717937469482422, 0.088625192642211914, 0.088654994964599609]
$ python -O -c 'import timeit;print timeit.repeat("assert True")'
[0.029736995697021484, 0.029587030410766602, 0.029623985290527344]

実際のシナリオでは、通常、節約額ははるかに少なくなります。

docstring を削除すると、コードのサイズが縮小される可能性があるため、ワーキング セットが縮小される可能性があります。

多くの場合、パフォーマンスへの影響は無視できますが、最適化の場合と同様に、確認する唯一の方法は測定することです。

于 2009-11-07T14:11:28.583 に答える
7

を使用する正当な理由に遭遇したことはありません-O。私は常に、その主な目的は、将来のある時点で意味のある最適化が追加された場合に備えていると想定してきました。

于 2009-11-07T18:18:41.017 に答える
5

の最もヘビーなユーザー-Opy2exe py2appなどだと思います。

私は個人的に-O直接の用途を見つけたことはありません。

于 2009-11-07T14:08:28.027 に答える
4

あなたはそれをほとんど理解しました: それは実質的に何もしません. RAMに深刻なダメージを与えていない限り、速度やメモリの向上はほとんど見られません.

于 2009-11-07T14:08:15.703 に答える