効率のために、Python がそのオブジェクトのヒープ (および名前空間のシステムですが、多かれ少なかれ明確です) でどのように機能するかを理解しようとしています。したがって、基本的に、オブジェクトがいつヒープにロードされるか、そこにいくつあるか、それらがどれくらい生きているかなどを理解しようとしています.
そして私の質問は、パッケージを操作してそこから何かをインポートするときです:
from pypackage import pymodule
どのオブジェクトがメモリ(Python インタープリターのオブジェクト ヒープ) にロードされますか? そしてより一般的に:何が起こるのですか?:)
上記の例は次のようなことをしていると思います:パッケージのオブジェクトがpypackage
メモリに作成され(パッケージに関する情報が含まれていますが、それほど多くはありません)、モジュールpymodule
がメモリにロードされ、その参照がローカル名前空間に作成されました. ここで重要なことはpypackage
、明示的に記述されていない限り(または他のオブジェクト) の他のモジュールがメモリ内に作成されていないことです (モジュール自体、またはパッケージの初期化のトリックとフックのどこかで、私がよく知らない) . 最後に記憶に残る唯一の大きなことはpymodule
(つまり、モジュールがインポートされたときに作成されたすべてのオブジェクト)。そうですか?誰かがこの問題を少し明確にしてくれれば幸いです。多分あなたはそれについてのいくつかの有用な記事をアドバイスできますか? (ドキュメンテーションはより具体的なものをカバーしています)
モジュールのインポートに関する同じ質問に対して、次のことがわかりました。
Python がモジュールをインポートするとき、まずモジュール レジストリ (sys.modules) をチェックして、モジュールが既にインポートされているかどうかを確認します。その場合、Python は既存のモジュール オブジェクトをそのまま使用します。
それ以外の場合、Python は次のようにします。
- 新しい空のモジュール オブジェクトを作成します (これは基本的に辞書です)。
- そのモジュール オブジェクトを sys.modules ディクショナリに挿入します。
- モジュール コード オブジェクトを読み込みます (必要に応じて、最初にモジュールをコンパイルします)。
- 新しいモジュールの名前空間でモジュール コード オブジェクトを実行します。コードによって割り当てられたすべての変数は、モジュール オブジェクトを介して使用できます。
また、パッケージについても同様の説明をいただければ幸いです。
ちなみに、パッケージではモジュール名がsys.modules
奇妙なことに追加されます:
>>> import sys
>>> from pypacket import pymodule
>>> "pymodule" in sys.modules.keys()
False
>>> "pypacket" in sys.modules.keys()
True
また、同じ問題に関する実践的な質問もあります。
さまざまなプロセスやプログラムで使用される可能性のある一連のツールを構築するとき。そして、それらをモジュールに入れました。そこで宣言された関数を 1 つだけ使用したい場合でも、完全なモジュールをロードするしかありません。私が見たように、小さなモジュールを作成してパッケージに入れることで、この問題を軽減することができます (モジュールの 1 つだけをインポートしたときにパッケージがすべてのモジュールをロードしない場合)。
そのようなライブラリを Python で作成するより良い方法はありますか? (モジュール内に依存関係がない単なる関数で。)C拡張で可能ですか?
PS 長い質問で申し訳ありません。