7

私は、日々のコーディングを支援するために、多くの個人用ライブラリを作成しました。ベスト プラクティスは、Python プログラムの先頭にインポートを配置することです。しかし、ライブラリをインポートしたり、ライブラリから関数やクラスだけをインポートしたりします。すべてのモジュールがインポートされます (それらのモジュールが他の未使用のクラスまたは関数で使用されている場合でも)。これにより、プログラムのオーバーヘッドが増加すると思いますか?

一例です。次のようなpytoolsというライブラリがあります

import difflib

def foo():
    # uses difflib.SequenceMatcher

def bar():
    # benign function ie
    print "Hello!"
    return True

class foobar:
    def __init__():
        print "New foobar"
    def ret_true():
        return True

関数 foo は difflib を使用します。ここで、bar と foobar を使用する必要がある新しいプログラムを作成しているとします。私はどちらかを書くことができました

import pytools
...
item = pytools.foobar()
vals = pytools.bar()

または私ができる

from pytools import foobar, bar
...
item = foobar()
vals = bar()

どちらを選択しても、オーバーヘッドが削減されるか、または foo のインポートとその difflib への依存が排除されますか? difflib へのインポートが foo 関数内にある場合はどうなるでしょうか?

私が直面している問題は、単純なプログラムをライブラリから 1 つまたは 2 つのクラスまたは関数のみを使用する実行可能ファイルに変換する場合です。実行可能ファイルは最終的に 50 MB 程度になります。

py2exe のサイズの最適化ページを読み、その提案のいくつかを使用して最適化できます。

http://www.py2exe.org/index.cgi/OptimizingSize

ここでベストプラクティスを本当に求めていると思います。依存関係が未使用の関数またはクラスにあるライブラリのインポートを排除する方法はありますか? デバッガーを使用して import ステートメントが実行されるのを見てきましたが、Python は先に進む前に「def somefunction」を含む行のみを「ピックアップ」しているようです。関数/クラスが使用されるまで、残りのインポートは完了しませんか? これは、関数またはクラスの先頭に大量のインポートを配置すると、残りのライブラリのオーバーヘッドを削減できることを意味します。

4

1 に答える 1

4

依存関係を効果的に減らす唯一の方法は、ツール ボックスを小さなモジュールに分割し、必要なモジュールのみをインポートすることです。

未使用の関数の先頭にインポートを配置すると、実行時にこれらのモジュールをロードできなくなりますが、依存関係が隠されるため推奨されません。さらに、Python から実行可能ファイルへのコンバーターには、これらのモジュールを含める必要がある可能性があります。これは、Python の動的な性質により、どの関数が実際に呼び出されているかを静的に判断することが不可能になるためです。

于 2012-06-22T15:34:26.867 に答える