2009-04-20 10 views
9

組み込みモジュールとユーザー定義モジュールの両方のインポートに要する時間を知りたい。Pythonでのインポートにかかった時間

+0

それが変化します。具体的なシナリオや状況をご記入ください。 –

+0

-1:追加の事実を回答コメントに入れました。新しい事実は、答えではなく質問に入れられるべきです。 –

答えて

5

あなたはこの走っ

$ time python -c "import math" 

をテストすることができますしかし、何これはあなたを助けるでしょうか?輸入は一度しか行われず、ボトルネックになることはほとんどありません。同じモジュールを何度もインポートすることは、Pythonがどのモジュールが既にインポートされているかを追跡するので、一度インポートするよりも大幅に遅く実行されることはありません。

実際に達成しようとしていることは何ですか?

+0

私は他のモジュールをインポートするマスタースクリプトを持っています。どのくらいの時間がかかるかを計算する必要があります – user46646

+0

@rejinacm:あなたの質問を新しい事実で更新してください。 –

1

使用cProfile:Pythonの2.4で、Windows上でテストされ

python -m cProfile yourscript.py 
+0

私はIDLE.I m SyntaxErrorを取得しています – user46646

+0

私が与えたコマンドは、Pythonインタプリタの中ではなく、コマンドラインから実行するコマンドでしょう。 – vezult

0

- あなたはそれを自分で試すことができます。

>>> import time 

>>> ## Built-in module 
>>> def testTime(): 
     now = time.clock() # use time.time() on unix-based systems 
     import math 
     print time.clock() - now 

>>> testTime() 
7.54285810167e-006 



>>> ## My own module 
>>> def testTime(): 
     now = time.clock() 
     import myBuiltInModule # Not its actual name ;-) 
     print time.clock() - now 

>>> testTime() 
0.00253174635324 
>>> testTime() 
3.70158777141e-006 

キャッシュされたモジュールと最初から持ち込まれたモジュールとの間には大きな違いがあります。説明するために、我々はモジュールをリロードすることができます

>>> def testTime(): 
     now = time.clock() 
     reload(myBuiltInModule) 
     print time.clock() - now 


>>> testTime() 
0.00250017809526 
3

輸入にかかる時間を調べるには、最も簡単な方法は、おそらく、そうurllibは1万回をインポートするtimeit module ..

>>> import timeit 
>>> t = timeit.Timer('import urllib') 
>>> t.timeit(number = 1000000) 
0.98621106147766113 

を使用していますそれだけで(MacBook Proの上の)第二の下で取った。..

を私は他のmodules.Iをインポートマスタースクリプトを持っていることが

かかりますどのくらいの時間を計算する必要があります

あなたは、全スクリプトの実行時間を意味する場合は、Linux上の/ OS X/Cygwinの、あなたが例えば、timeコマンドを使用してスクリプトを実行できます。

$ time python myscript.py 

real 0m0.046s 
user 0m0.024s 
sys  0m0.020s 

(つまり、すべてのPythonインタプリタを含み覚え起動時だけでなく、実際のコードの実行時間、それはかなり些細な量だが)

もう一つは、おそらくより有用な方法は、スクリプトをプロファイルすることです:

代わりの

でコードを実行しています
$ python myscript.py 

使用しています。

$ python -m cProfile myscript.py 
     1059 function calls in 0.015 CPU seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.000 0.000 0.000 0.000 <string>:1(<module>) 
     1 0.002 0.002 0.015 0.015 myscript.py:1(<module>) 
    [...] 

私は読むことが非常に簡単にコマンドライン出力が見つからないので、私はほとんど常にかなりgraphvizのグラフにプロファイリング情報を回すgprof2dot、使用:

$ python -m cProfile -o myscript.prof myscript.py 
$ python gprof2dot.py -o myscript.dot -f pstats myscript.prof 
$ dot -Tpng -o profile.png prof_runtest.dot -Gbgcolor=black 

Example output (1429x1896px PNG)

+0

うーん、実際にはこれが2回以上輸入されるとは思わない。 Pythonのモジュールキャッシュのパフォーマンスをテストするだけです。 'reload(module)'は、ゼロからのインポートと同じ動作をしません。インポートに時間がかからず、一度に1つの通話を測定するのが合理的でない限り、著者の質問に本当に答えるのは実際はかなり難しいです。 –

6

インポートをプロファイルする1つの方法は、bzr source codeで使用されるprofile_importsモジュールを使用することです。

# put those two lines at the top of your script 
import profile_imports 
profile_imports.install() 

# display the results 
profile_imports.log_stack_info(sys.stderr) 

これは、インポートのタイミングを与えることに加えて、正規表現をコンパイルする時間を予測します。これは、多くの場合、インポートの速度低下の重要な原因です。

0

私は、この問題に直面して、数秒の起動時間で大きなレガシーアプリケーションをプロファイリングしました。組み込みインポーターをいくつかのプロファイリングを行うものに置き換えるのは比較的簡単です。ここでは、インポートscipy.stats上でどのように見えるかだ、

import os 
import sys 
import time 


class ImportEventNode(object): 
    def __init__(self, name, start_time, children=None, end_time=None): 
     self.name = name 
     self.start_time = start_time 
     self.children = [] if children is None else children 
     self.end_time = end_time 

    def __repr__(self): 
     return 'ImportEventNode({self.name}, {self.start_time}, children={self.children}, end_time={self.end_time})'.format(self=self) 

    @property 
    def total_time(self): 
     return self.end_time - self.start_time 

    @property 
    def net_time(self): 
     return self.total_time - sum(child.total_time for child in self.children) 


root_node = cur_node = None 

all_nodes = [] 
old_import = __import__ 
def __import__(*args, **kwargs): 
    global root_node, cur_node 
    name = args[0] 
    if name not in sys.modules: 
     t0 = time.time() 
     if root_node is None: 
      root_node = prev_node = cur_node = lcur_node = ImportEventNode(args[0], t0) 
     else: 
      prev_node = cur_node 
      cur_node = lcur_node = ImportEventNode(name, t0) 
      prev_node.children.append(cur_node) 
     try: 
      ret = old_import(*args, **kwargs) 
     finally: 
      lcur_node.end_time = time.time() 
     all_nodes.append(lcur_node) 
     cur_node = prev_node 
     return ret 
    else: 
     return old_import(*args, **kwargs) 


__builtins__.__import__ = __import__ 

簡単な例で実行:以下の各モジュールが実行するのにかかるおおよそどのくらいを示すのハック方法です

:import scipy.stats 
: 
:nodes = sorted(all_nodes, key=(lambda x: x.net_time), reverse=True) 
:for node in nodes[:10]: 
: print(node.name, node.net_time) 
: 
:<EOF> 
('pkg_resources', 0.08431100845336914) 
('', 0.05861020088195801) 
('decomp_schur', 0.016885995864868164) 
('PIL', 0.0143890380859375) 
('scipy.stats', 0.010602712631225586) 
('pkg_resources._vendor.packaging.specifiers', 0.007072925567626953) 
('add_newdocs', 0.00637507438659668) 
('mtrand', 0.005497932434082031) 
('scipy.sparse.linalg', 0.005171060562133789) 
('scipy.linalg', 0.004471778869628906) 
関連する問題