12

モジュールが読み込まれると、Python docstring とコメントはメモリに保存されますか?

私は通常、自分のコードをよく文書化しているので、これが本当かどうか疑問に思っていました。これはメモリ使用量に影響しますか?

通常、すべての Python オブジェクトには__doc__メソッドがあります。これらの docstring はファイルから読み取られますか、それとも別の方法で処理されますか?

ここでフォーラム、Google、メーリング リストを検索しましたが、関連する情報は見つかりませんでした。

あなたはよく知っていますか?

4

4 に答える 4

25

デフォルトでは、docstring は.pycバイトコード ファイルに存在し、そこから読み込まれます (コメントは含まれません)。使用する場合python -OO(-OOフラグは「最適化を強く」-Oを表し、これは「穏やかに最適化する」を表すのとは対照的に)、.pyoファイルの代わりに.pycファイルを取得して使用し、それらは docstring を省略することによって最適化されます (によって行われる最適化に加えて-O、ステートメントを削除assertします). たとえば、次のようなファイルfoo.pyを考えてみましょう:

"""This is the documentation for my module foo."""

def bar(x):
  """This is the documentation for my function foo.bar."""
  return x + 1

次のシェルセッションを持つことができます...:

$ python -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyc
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyc
$ python -O -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
$ rm foo.pyo
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
23
None
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  204 Dec 30 16:17 foo.pyo

-O最初に使用したため、.pyoファイルは 327 バイトだったことに注意してください。使用後-OOでも、.pyoファイルがまだ残っていて、Python が再構築/上書きしなかったため、既存のものを使用しただけです。既存のものを削除する.pyo(または、touch foo.pyPython.pyoが「時代遅れ」であることを認識できるようにする) ことは、Python がそれを再構築することを意味します (そして、この場合、ディスク上で 123 バイトを節約し、モジュールがインポートされたときにもう少し節約します -- しかし、すべての.__doc__エントリが消え、 に置き換えられますNone)。

于 2009-12-31T00:21:29.157 に答える
12

はい、ドキュメント文字列はファイルから読み取られますが、それで書き込みが停止することはありません。パフォーマンス テストを行って、懸念していることが実際に問題を引き起こしているプログラムのボトルネックであることが判明するまでは、パフォーマンスのためにコードの可読性を妥協しないでください。docstring が実際の状況で測定可能なパフォーマンスの影響を引き起こす可能性は非常に低いと思います。

于 2009-12-31T00:01:59.753 に答える
5

それらファイルから読み取られます (ファイルが pyc にコンパイルされるとき、または pyc がロードされるとき - それらは で利用可能でなければなりませんobject.__doc__) しかし、そうではありません--> これは、合理的な状況下ではパフォーマンスに大きな影響を与えませんか、それとも本当に書いていますか?数メガバイトのドキュメント文字列?

于 2009-12-30T23:59:41.443 に答える
1

モジュールが読み込まれると、Python docstring とコメントはメモリに保存されますか?

Docstring は .pyc ファイルにコンパイルされ、メモリに読み込まれます。コメントはコンパイル中に破棄され、コンパイル中にそれらを無視するのにかかるわずかな余分な時間を除いて、何にも影響を与えません (.py ファイルへの変更後に一度だけ発生します。走る)。

また、これらの文字列は、モジュール、クラス定義、または関数定義の最初のものである場合にのみ保持されることに注意してください。追加の文字列はほとんどどこにでも含めることができますが、コメントと同様にコンパイル中に破棄されます。

于 2009-12-31T00:23:11.817 に答える