私は非常に長いpythonファイルを持っていることが多く、インポートは非常に速くスタックする傾向があります。
PEP8 によると、インポートは常にファイルの先頭に書き込む必要があります。
ファイルにコード化された関数を呼び出すと、インポートされたすべてのライブラリがインポートされますか? それとも、必要なライブラリだけが呼び出されますか?
これについて心配するのは理にかなっていますか?それらを必要とする関数またはクラス内にライブラリをインポートする理由はありませんか?
Python は import ステートメントにヒットするたびに、そのモジュールが既にインポートされているかどうかを確認し、インポートされていない場合はインポートします。したがって、ファイルが別のモジュールによって実行またはインポートされるとすぐに、ファイルの先頭にあるインポートが行われます。
これにはいくらかのオーバーヘッドがあるため、通常はインポートをファイルの先頭に置いて、コストが前もって処理されるようにすることをお勧めします。
インポートに最適な場所は、ファイルの先頭です。これにより、依存関係が 1 か所に文書化され、依存関係がないことによるエラーがより早く表示されます。インポート自体は実際にはステートメントの時点で行われますがimport
、これが問題になることはめったにありません。
ライブラリを必要とする関数またはメソッドに到達するまで、ライブラリをインポートしないことで何かが得られることは一般的ではありません。(クラスの本体内でこれを行うことによって得られるものは何もありません。) オプションの依存関係が必要になることはまれであり、これがそれらを取得するための正しい手法であることはさらにまれです。説得力のある使用例を教えてください。
これについて心配するのは理にかなっていますか?
いいえ
ライブラリを必要とする関数またはクラス内にライブラリをインポートする理由はありません。import
ステートメントが一度インポートされたかどうかを確認し、インポートされたことを認識する必要があるため、処理が遅くなります。
これを頻繁に呼び出される関数に入れると、すべてのimport
チェックに時間を浪費する可能性があります。
インポートは、関数が呼び出されたときではなく、インポートを含むモジュールが実行またはインポートされたときに発生します。
普段なら、気にすることはありません。スローダウンが発生している場合は、プロファイルを作成して、問題がこれに関連しているかどうかを確認できます。そうである場合は、モジュールをより小さなモジュールに分割できるかどうかを確認できます。
しかし、すべてのファイルが同じプログラムによって使用されている場合は、とにかくすべてをインポートすることになります。
モジュール内の関数が特定の他のモジュールをインポートする唯一の関数である場合 (設定オプションがオンの場合にのみツイートを送信する関数があるとします)、その特定のモジュールを関数にインポートすることは理にかなっています。
プロファイリング データで別のことが証明されていない限り、私の推測では、関数内の import ステートメントのオーバーヘッドはまったく無視できるものです。