1

私はまだ、質問のような一見単​​純なことをテストおよびプロファイリングするためのツールを持っている (またはそれらを開発または使用する方法を知っている) レベルに達していないので、あなたに頼ります。

条件をチェックし、その条件に基づいて (異なるモジュール) で動作する最適な数学ツールを選択する関数がありますが、この関数は配列のウィンドウに適用されるため、ループされます。ウィンドウごとに異なるインポートが発生する可能性がありますが、インポートが実際にループされているのか、これがパフォーマンスの問題なのか疑問に思います。

これはmatplotlibソースからの例です

def pause(interval):
    """
    Pause for *interval* seconds.

    If there is an active figure it will be updated and displayed,
    and the GUI event loop will run during the pause.

    If there is no active figure, or if a non-interactive backend
    is in use, this executes time.sleep(interval).

    This can be used for crude animation. For more complex
    animation, see :mod:`matplotlib.animation`.

    This function is experimental; its behavior may be changed
    or extended in a future release.

    """
    backend = rcParams['backend']
    if backend in _interactive_bk:
        figManager = _pylab_helpers.Gcf.get_active()
        if figManager is not None:
            canvas = figManager.canvas
            canvas.draw()
            show(block=False)
            canvas.start_event_loop(interval)
            return

    # No on-screen figure is active, so sleep() is all we need.
    import time
    time.sleep(interval)

ループ内の場合、開始と終了の数字が交互に繰り返されると、1 回おきにインポートされますか? それとも、インポートが最初に呼び出されたときにインポートされ、その後のインポートは無視されますか?

ありがとう

4

2 に答える 2

5

が正常にimport完了すると、インポートされたモジュールがキャッシュされsys.modules、後続のimportステートメントでモジュールが検出されるsys.modulesため、モジュールは再インポートされません。reload組み込み関数を使用して、モジュールの再インポートを強制できます。

ドキュメントから:

インポート検索で最初にチェックされるのはsys.modulesです。このマッピングは、中間パスを含め、以前にインポートされたすべてのモジュールのキャッシュとして機能します。したがって、foo.bar.bazが以前にインポートされた場合、 、、およびsys.modulesのエントリが含まれます。foofoo.barfoo.bar.baz

PEP 8 (Python スタイル ガイド) では、インポートはメソッド内ではなく、ファイルの先頭に配置することを推奨しています。このルールを破る (「遅延インポート」を行う) 正当な理由は、モジュールのインポートが高価で、プログラムでめったに使用されない (通常の実行ではまったく使用されない) 場合、または循環インポート依存関係を解決する場合 (ただし、その場合) です。モジュールの機能をより適切に分割することで、循環性を解決しようとする必要があります)。Python に組み込まれているのようなモジュールtimeの場合、レイト インポートを使用する理由はほとんどありません。

于 2012-11-27T11:39:51.353 に答える
1

実際のアクションはimport一度だけ発生します (これが、再度インポートする必要がある場合に明示的に行う必要がある理由ですreload)。インタープリターは、既にインポートされているかどうかを確認します。

ただし、通常は、すべてのインポートをモジュールの先頭に配置する方がPythonicです。

于 2012-11-27T11:42:08.727 に答える