2011-01-07 1 views
2

私のコードの約25%はモジュールに依存しています:Traits、tvtk、...かなり重いです。通常、私のマシンでは2秒(そして他のマシンではそれ以上)の時間がかかります。重いpythonのインポートを整理する

私のモジュールには、これらには、以下の

mainmodule 
|--submodule1 
|--submodule2 
    |--subsubmodule1 
    |--subsubmodule2 
|--submodule3 
|--submodule4 
    |--subsubmodule1 
    |--subsubmodule2 

、submodule1とsubmodule2使用済みの特徴として編成されています。つまり、私がをインポートメインモジュールと呼ぶと、重いモジュールがインポートされるのを待たなければならないでしょうが、それらは使用されません。

インポート時間を短縮できるようにインポートを整理するにはどうすればよいですか?のみ呼び出す

import mainmodule 

mainmodule 
|--submodule3 
|--submodule4 
    |--subsubmodule1 
    |--subsubmodule2 

を持っている:

import mainmodule.heavy 

が持っているすべてのもの

+3

何?あなたが何を求めているかは非常に不明です。 – Falmarri

+1

別の質問に答える:形質などをzipファイルに入れて、そのzipファイルをPYTHONPATHに置くことができます。これにより、ファイルへのアクセス回数が大幅に減るため、全体のインポート時間が短縮される可能性があります。 –

+0

@Falmarri:質問を更新しましたが、その意図はより明確です。 @ Andrew Dalke:どのファイルがTraitsの一部であるかをどのように知るのですか? –

答えて

3

mainmoduleをインポートすると、自動的にロードするのに長い時間がかかるsubmodule1submodule2を、インポートしないように、何がしたいことの方法があるようですね。

これはかなり簡単です。 submodule1submodule2は、必要な機能でのみインポートすることができます。または、これらの機能を別のモジュールmainmodule_heavy.pyに移動します。

(それともでしhack the Python module system to load modules lazily。しかし、ハックのようなものは、問題を引き起こす傾向があり、そしてそれはあなたのケースのために不要な音が鳴ります。)

3

あなたができる

はたぶんような何かをする方法がありますコードを書く -

def heavy(): 
    global x 
    global y 
    import x, y 

def mainmodule(): 
    if heavy not in globals(): 
     import heavy 

実際には、同じプログラム内では機能がインポートできないため、これは機能しません。また、モジュール自体ではなく、文字列をグローバル内でチェックしたいとします。だから、代わりに: -

def heavy(): 
    global x 
    global y 
    import x, y 

def mainmodule(): 
    if 'x' not in globals() or 'y' not in globals(): 
     heavy() 
関連する問題