2017-10-10 11 views
3

関数内で使用するためにPythonライブラリをインポートしたいとします。関数内でライブラリをインポートするか、グローバルにインポートする方が良いでしょうか?関数内のPythonライブラリのインポートとグローバルインポートの違いは?

この

def test_func: 
    import pandas as pd 
    # code implementation 

またはグローバルインポートするのpythonファイルの先頭に以下の行を持っていますか?

import pandas as pd 

各アプローチの賛否両論は何ですか?どのpythonのベストプラクティスですか?

私は、PythonのV3.6に

EDITを使用しています:いくつかの明確化を行うこと。

私に2つの機能があるとします。

def func1: 
    import pandas as pd 
    # code implementation 

def func2: 
    import pandas as pd 
    # code implementation 

pythonスクリプトは両方の機能を実行します。ライブラリを2回インポートするのか、それとも1回だけインポートするのに十分なほどスマートなPythonコンパイラですか?これはパフォーマンスに影響します。

答えて

3

名前の表示と実行の時点の違いです。ロードしているファイルをインポートまたは実行すると、モジュールレベルのインポートがインポートされます。この関数は、関数が実行されている場合にのみ、ローカルなものです。インポートされた名前は、ファイル内のすべてのものに表示されるか、またはインポートが実行される関数内でのみ表示されます。

importステートメントを打つためのコストがかかりますが(小さいものの、それでも)、ローカル1つは常に実行されます。しかし、モジュールを完全に再インポートすることはありません。初めてPythonをインポートすると、Pythonはモジュールをキャッシュします(reloadおよびsys.modules参照)。

モジュールレベルのインポートを使用することをお勧めします。これはコードの99.999%で表示されるものです。大きな理由はメンテナンス性です。モジュールの依存関係を理解し​​たい場合は、すべてのコードを組み合わせるのではなく、上を見るだけで便利です。

したがって、関数のローカルインポートを使用するのはいつですか?

  • 以前のインポートを使用することはできません。

    は、3つのシナリオがあります。これは、例えばdbまたは他のシステム/機能のバックエンドは、コンフィグレーションまたはシステム検査によって実行時に選択されます。

  • これ以外の場合は、円形のインポートがあります。これはまれなケースであり、コード臭もあります。必要な場合は、リファクタリングを検討してください。

  • モジュールのインポートを延期することによって起動時間を短縮します。しかし、これは非常にまれです。

あなたのケースでは、答えは素早く簡単な「しないでください」です。

+0

私は、さらなる説明のために質問にいくつかの編集を加えました。助けてもらえますか?ありがとう。 – user3848207

1

モジュールはインポート時にロードされるため、ほとんど使用されないモジュールをインポートする必要がありますが、初期化に多くの時間がかかる場合は、必要なときにインポートする必要があります。

実際にはパフォーマンスは気にするが、読みやすさは気にしないと、本当に必要なときにモジュールを読み込むほうが良いかもしれません。

しかし、私たちのプログラムを維持しておく必要があります。一番上のすべてのモジュールをインポートすることは、他の人に伝えて、どのモジュールが使用されているかを自分自身で書く最も明白な方法です。

実際には非常に高価ですがほとんど使用されないモジュールを使用する場合は、ローカルにインポートする必要があります。それ以外の場合は、上部にインポートする必要があります。

+0

あなたのパフォーマンスに関するコメントは誤解を招きます。インポートは常に関数実行時に実行されます。モジュール自体はキャッシュされているので再ロードされませんが、コードは実行されます。メンテナンスのために良い! – deets

+0

@deets "メンテナンス"という言葉を誤解しているようですね?確かに私はキャッシュを使用してモジュールを再インポートすることを知っていますが、巨大なプロジェクトではファイル全体で使用されているすべてのモジュールを探したいのですか? – Sraw

+0

私は、さらなる明確化のために質問にいくつかの編集を加えました。助けてもらえますか?ありがとう。 – user3848207

関連する問題