2

Python では、文字列は単なる式であり、コードの呼び出し元に制御が戻るとすぐに文字列自体がガベージ コレクションされることを理解していますが、...

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

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

4

2 に答える 2

10
  • 「Pythonでは文字列は単なる式であり、コードの呼び出し元に制御が戻るとすぐに文字列自体がガベージコレクションされることを理解しています」と誤解を示していると思います。docstringは(すべての関数呼び出しでではなく)1回評価され、少なくとも関数が実行する限り存続します。

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

  • Pythonの-OOコマンドラインスイッチはdocstringを削除します。

于 2010-04-29T16:22:17.037 に答える
2

Python docstringは、関数またはモジュールの__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オプションにより、生成されたファイルからdocstringが削除されるよう.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誰かがこの振る舞いを説明できますか?

于 2010-04-29T16:38:21.953 に答える