組み込みモジュールとユーザー定義モジュールの両方のインポートに要する時間を知りたい。Pythonでのインポートにかかった時間
答えて
あなたはこの走っ
$ time python -c "import math"
をテストすることができますしかし、何これはあなたを助けるでしょうか?輸入は一度しか行われず、ボトルネックになることはほとんどありません。同じモジュールを何度もインポートすることは、Pythonがどのモジュールが既にインポートされているかを追跡するので、一度インポートするよりも大幅に遅く実行されることはありません。
実際に達成しようとしていることは何ですか?
私は他のモジュールをインポートするマスタースクリプトを持っています。どのくらいの時間がかかるかを計算する必要があります – user46646
@rejinacm:あなたの質問を新しい事実で更新してください。 –
使用プロファイラ:http://docs.python.org/library/profile.html
とにかく、輸入がキャッシュされます。
- あなたはそれを自分で試すことができます。
>>> 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
輸入にかかる時間を調べるには、最も簡単な方法は、おそらく、そう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
うーん、実際にはこれが2回以上輸入されるとは思わない。 Pythonのモジュールキャッシュのパフォーマンスをテストするだけです。 'reload(module)'は、ゼロからのインポートと同じ動作をしません。インポートに時間がかからず、一度に1つの通話を測定するのが合理的でない限り、著者の質問に本当に答えるのは実際はかなり難しいです。 –
インポートをプロファイルする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)
これは、インポートのタイミングを与えることに加えて、正規表現をコンパイルする時間を予測します。これは、多くの場合、インポートの速度低下の重要な原因です。
私は、この問題に直面して、数秒の起動時間で大きなレガシーアプリケーションをプロファイリングしました。組み込みインポーターをいくつかのプロファイリングを行うものに置き換えるのは比較的簡単です。ここでは、インポート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)
- 1. Python iris NetCDF時間が狂った
- 2. シェルとPythonドライバを使用したCassandraデータのインポート時間
- 3. インポート時の "間違ったトップステートメントの宣言" scala.reflect.ClassTag
- 4. 間違った時間@JsonFormat(1時間)
- 5. Excelからインポートした時間値の計算方法は?
- 6. 時間モジュールと関数(時間のインポート時から)が機能しない
- 7. Hadoopジョブの実行にかかった時間
- 8. パイソン - UTC時間Pythonで序数時間から
- 9. なぜ私は間違った時間になるのですか?
- 10. Django、Haystack:検索にかかった時間を表示
- 11. Pythonの時間と分から合計時間への変換
- 12. C++でdllからインポートされた間違ったオブジェクトの検出と消去
- 13. Ajaxに時間がかかり、間違った変数値を取得する
- 14. vs 2010でのデバッグにかかった時間を追跡する方法は?
- 15. snowflakeからjupyterノートブックデータフレームに時間カラムをインポートするには?
- 16. pythonではstr()とint()の時間がかかりますか?
- 17. 異なるバージョンのPython間でのインポート
- 18. python 2.7で書かれたパッケージをPython 3にインポートする
- 19. python:秒から時、分、秒までのフォーマット時間
- 20. 間違った夏時間は、タイムゾーンオブジェクトから返さオフセット
- 21. pythonクエリ - 関数の引数が間違った型ですか?
- 22. インポート・スクリプト間違った順序は、
- 23. Pythonに「または」の何かが間違っています
- 24. Razorのマウスオーバー時に間違ったURL
- 25. matplotlib.pyplotのインポート時にPythonがクラッシュする
- 26. あなたのURL内でのインポート時間の使用
- 27. Pythonは時間が変数で2時間の間であるかどうかを判断します
- 28. mallocに複数の小さな時間をかかったり、大きな時間をほとんど使わなかったりしますか?
- 29. 時間のPython epoc時間のみ?
- 30. Pythonでの時間ループ
それが変化します。具体的なシナリオや状況をご記入ください。 –
-1:追加の事実を回答コメントに入れました。新しい事実は、答えではなく質問に入れられるべきです。 –