Python-大きなドキュメントストリングスはメモリを無駄にしますか?

StackOverflow https://stackoverflow.com/questions/2738904

質問

Pythonでは、文字列は単なる表現であり、コードの発信者に制御が戻ったときにすぐに文字列が収集されることを理解していますが、...

  1. コード内の大きなクラス/メソッドドキュメント文字列:文字列オブジェクトを構築することでメモリを無駄にしますか?
  2. モジュールレベルのドキュメント文字列:通訳によって無限に保存されていますか?

これは重要ですか?私の唯一の懸念は、Djangoのような大きなフレームワーク、または複数の大規模なオープンソースライブラリのような大きなフレームワークを使用している場合、潜在的に複数のテキストで非常に十分に文書化される傾向があるという考えから来ました。これらの場合、途中で使用されてからそこに保持されるコードのメモリにロードされたドキュメント文字列がありますか、それとも通常の文字列のようにすぐに収集されますか?

役に立ちましたか?

解決

  • 「Pythonでは、文字列は単なる表現であり、文字列自体がコードの発信者へのコントロールが戻ってすぐにゴミが収集されることを理解しています」と私は思う。ドキュストリングは一度評価され(すべての関数呼び出しではなく)、関数がそうである限り生存し続けます。

  • 「これも重要ですか?」最適化に関しては、抽象的に考えることではなく、測定することによって回答されます。テキストの「複数のメガバイト」は、おそらくメモリ集約的なアプリケーションではそれほど多くはありません。メモリを保存するためのソリューションは他の場所に生息する可能性が高く、測定によってそれが当てはまるかどうかを判断できます。

  • Python's -OO コマンドラインスイッチはドキュストリングを削除します。

他のヒント

Python Docstringsは、関数またはモジュールの__DOC__属性を介してアクセスできるため、デフォルトでは無期限に保持されます。たとえば、以下はtest.pyで:

"""This is a test module."""

def f():
   """This is a test function."""
   pass

それで:

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__doc__
'This is a test module.'
>>> test.f.__doc__
'This is a test function.'
>>> 

-OO インタープリターへのオプションにより、明らかに生成されたものからdocstringsを削除するようになります .pyo ファイルですが、私が期待する効果はありません:

$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.py'
>>> 
$ grep "This is a test" /tmp/test.pyo
Binary file /tmp/test.pyo matches
$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.pyo'
>>> test.__doc__
'This is a test module.'
>>> 

そして実際、 test.pyo で生成されたファイル -OO と同じです test.pyc コマンドライン引数なしで生成されたファイル。誰かがこの行動を説明できますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top