回答:
Pythonの最も簡単な方法:
import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
これは、プログラムの実行に少なくとも10分の1秒かかることを前提としています。
プリント:
--- 0.764891862869 seconds ---
round(time.time() - start_time, 2)
(またはあなたが望むどんな小数でも)、私は1.24e-5のような科学的数値を取り戻していました。
'%.2f'
代わりにしたいでしょうround()
。
このtiming.py
モジュールを自分のsite-packages
ディレクトリに置き、モジュールimport timing
の上部に挿入します:
import atexit
from time import clock
def secondsToStr(t):
return "%d:%02d:%02d.%03d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(t*1000,),1000,60,60])
line = "="*40
def log(s, elapsed=None):
print line
print secondsToStr(clock()), '-', s
if elapsed:
print "Elapsed time:", elapsed
print line
print
def endlog():
end = clock()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
def now():
return secondsToStr(clock())
start = clock()
atexit.register(endlog)
log("Start Program")
timing.log
プログラム内に表示したい重要なステージがある場合は、プログラム内から呼び出すこともできます。ただし、これを含めるだけでimport timing
、開始時刻と終了時刻、および全体の経過時間が出力されます。(私の曖昧なsecondsToStr
関数を許してください、それは秒の浮動小数点数をhh:mm:ss.sss形式にフォーマットするだけです。)
from functools import reduce
は、上部に追加 し、各印刷ステートメントを角かっこで囲みます。よく働く!
LinuxまたはUnixの場合:
$ time python yourprogram.py
Windowsでは、このStackOverflowの質問を参照してください:Windowsコマンドラインでコマンドの実行時間を測定するにはどうすればよいですか?
より詳細な出力については、
$ time -v python yourprogram.py
Command being timed: "python3 yourprogram.py"
User time (seconds): 0.08
System time (seconds): 0.02
Percent of CPU this job got: 98%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 9480
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1114
Voluntary context switches: 0
Involuntary context switches: 22
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
secondsToStr()
機能を見てください。
ポールマクガイアの答えは本当に好きですが、私はPython 3を使用しています。したがって、興味のある人のために、* nixでPython 3を使用する彼の回答の変更を以下に示します(Windowsでは、clock()
代わりに使用する必要があると思いますtime()
)。
#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta
def secondsToStr(elapsed=None):
if elapsed is None:
return strftime("%Y-%m-%d %H:%M:%S", localtime())
else:
return str(timedelta(seconds=elapsed))
def log(s, elapsed=None):
line = "="*40
print(line)
print(secondsToStr(), '-', s)
if elapsed:
print("Elapsed time:", elapsed)
print(line)
print()
def endlog():
end = time()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
start = time()
atexit.register(endlog)
log("Start Program")
これが便利だと思った場合でも、彼がほとんどの作業を行ったので、この答えの代わりに彼の答えに賛成投票してください;)。
timedelta(seconds=t).total_seconds()
役立ちます。
import time
start_time = time.clock()
main()
print time.clock() - start_time, "seconds"
time.clock()
プロセッサ時間を返します。これにより、このプロセスで使用されている時間のみを計算できます(とにかくUnix上で)。ドキュメントには、「いずれにしても、これはPythonまたはタイミングアルゴリズムのベンチマークに使用する関数です」と書かれています。
datetime
モジュールが提供する出力が好きです。時間デルタオブジェクトは、必要に応じて日、時、分などを人間が読める方法で示します。
例えば:
from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))
サンプル出力例
Duration: 0:00:08.309267
または
Duration: 1 day, 1:51:24.269711
JF Sebastianが述べたように、このアプローチは現地時間でいくつかのトリッキーなケースに遭遇する可能性があるため、使用する方が安全です。
import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
timedelta(seconds=time.monotonic()-start)
ここで(またはtime.time()
間隔が大きい場合)使用できます。現地時間を表す単純なdatetimeオブジェクトを減算しないでください。現地時間は単調ではありません
start_time = time.monotonic(); end_time = time.monotonic(); timedelta(seconds=end_time - start_time)
。私はあなたが正しいと信じていますが、それからあなたは戻ってくるときにそれをフォーマットする必要もありますdatetime.timedelta(0, 0, 76)
。また、単調な方法が唯一のPython 3で追加されたようだ
str()
それを「人間」にするためにそれに渡すことができると思います。回答を更新します、ありがとう。
PythonプロファイラーcProfileを使用して、CPU時間、さらに各関数内で費やされた時間と各関数が呼び出された回数を測定できます。これは、どこから始めればよいかわからずにスクリプトのパフォーマンスを向上させたい場合に非常に役立ちます。別のスタックオーバーフローの質問に対するこの回答はかなり良いです。ドキュメントもよく見るとよいでしょう。
コマンドラインからcProfileを使用してスクリプトをプロファイルする方法の例を次に示します。
$ python -m cProfile euler048.py
1007 function calls in 0.061 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.061 0.061 <string>:1(<module>)
1000 0.051 0.000 0.051 0.000 euler048.py:2(<lambda>)
1 0.005 0.005 0.061 0.061 euler048.py:2(<module>)
1 0.000 0.000 0.061 0.061 {execfile}
1 0.002 0.002 0.053 0.053 {map}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.003 0.003 0.003 0.003 {sum}
X function calls in Y CPU seconds
。壁掛け時計が必要な場合は、ここで他の回答のいずれかを使用してください。
Linuxにはさらに良い: time
$ time -v python rhtest2.py
Command being timed: "python rhtest2.py"
User time (seconds): 4.13
System time (seconds): 0.07
Percent of CPU this job got: 91%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 15
Minor (reclaiming a frame) page faults: 5095
Voluntary context switches: 27
Involuntary context switches: 279
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
時計()
バージョン3.3で廃止:この関数の動作はプラットフォームに依存します。明確に定義された動作を実現するには、要件に応じて代わりにperf_counter()またはprocess_time()を使用します。
time.perf_counter()
パフォーマンスカウンターの値(小数秒単位)を返します。つまり、短い期間を測定するために利用可能な最高の解像度を持つクロックです。これには、スリープ中に経過した時間が含まれ、システム全体に影響します。
time.process_time()
現在のプロセスのシステムとユーザーCPU時間の合計の値(小数秒単位)を返します。睡眠中に経過した時間は含まれません。
start = time.process_time()
... do something
elapsed = (time.process_time() - start)
timeit
モジュールを使用するだけです。Python 2とPython 3の両方で動作します。
import timeit
start = timeit.default_timer()
# All the program statements
stop = timeit.default_timer()
execution_time = stop - start
print("Program Executed in "+str(execution_time)) # It returns time in seconds
秒単位で戻り、実行時間を確保できます。簡単ですが、プログラムの実行を開始するw main関数にこれらを記述してください。エラーが発生した場合でも実行時間を取得したい場合は、パラメーター「Start」を取得して、次のように計算します。
def sample_function(start,**kwargs):
try:
# Your statements
except:
# except statements run when your statements raise an exception
stop = timeit.default_timer()
execution_time = stop - start
print("Program executed in " + str(execution_time))
finally
か?
次のスニペットは、経過時間を人間が読める<HH:MM:SS>
形式で出力します。
import time
from datetime import timedelta
start_time = time.time()
#
# Perform lots of computations.
#
elapsed_time_secs = time.time() - start_time
msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))
print(msg)
私はtimeitモジュールを見てきましたが、それはコードの小さなスニペットのみのためのようです。プログラム全体の時間を計りたい。
$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"
your_module.main()
関数を1回実行し、time.time()
関数をタイマーとして使用して経過時間を出力します。
/usr/bin/time
Pythonでエミュレートするには、/ usr / bin / timeを使用したPythonサブプロセスを参照してください。タイミング情報をキャプチャして、他のすべての出力を無視する方法は?。
time.sleep()
各関数のCPU時間を測定するには(たとえば、中に時間を含めないでください)、profile
モジュール(cProfile
Python 2)を使用できます。
$ python3 -mprofile your_module.py
あなたは合格可能性-p
にtimeit
あなたは同じタイマーを使用したい場合は、上記のコマンドprofile
モジュールの使用。
Paul McGuireの回答も気に入って、自分のニーズにより適したコンテキストマネージャフォームを思いつきました。
import datetime as dt
import timeit
class TimingManager(object):
"""Context Manager used with the statement 'with' to time some execution.
Example:
with TimingManager() as t:
# Code to time
"""
clock = timeit.default_timer
def __enter__(self):
"""
"""
self.start = self.clock()
self.log('\n=> Start Timing: {}')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""
"""
self.endlog()
return False
def log(self, s, elapsed=None):
"""Log current time and elapsed time if present.
:param s: Text to display, use '{}' to format the text with
the current time.
:param elapsed: Elapsed time to display. Dafault: None, no display.
"""
print s.format(self._secondsToStr(self.clock()))
if(elapsed is not None):
print 'Elapsed time: {}\n'.format(elapsed)
def endlog(self):
"""Log time for the end of execution with elapsed time.
"""
self.log('=> End Timing: {}', self.now())
def now(self):
"""Return current elapsed time as hh:mm:ss string.
:return: String.
"""
return str(dt.timedelta(seconds = self.clock() - self.start))
def _secondsToStr(self, sec):
"""Convert timestamp to h:mm:ss string.
:param sec: Timestamp.
"""
return str(dt.datetime.fromtimestamp(sec))
セルでは、Jupyterの%%time
magicコマンドを使用して実行時間を測定できます。
%%time
[ x**2 for x in range(10000)]
CPU times: user 4.54 ms, sys: 0 ns, total: 4.54 ms
Wall time: 4.12 ms
これは、特定のセルの実行時間のみをキャプチャします。ノートブック全体(つまりプログラム)の実行時間をキャプチャする場合は、同じディレクトリに新しいノートブックを作成し、新しいノートブックですべてのセルを実行します。
上記のノートブックが呼び出されたとしexample_notebook.ipynb
ます。同じディレクトリ内の新しいノートブックで:
# Convert your notebook to a .py script:
!jupyter nbconvert --to script example_notebook.ipynb
# Run the example_notebook with -t flag for time
%run -t example_notebook
IPython CPU timings (estimated):
User : 0.00 s.
System : 0.00 s.
Wall time: 0.00 s.
timeit
Pythonコードの実行時間を計測するために使用できるモジュールがあります。
詳細なドキュメントとPythonドキュメントの例、26.6があります。timeit —小さなコードスニペットの実行時間を測定します。
line_profilerを使用します。
line_profilerは、コードの個々の行の実行にかかる時間をプロファイルします。プロファイラーは、プロファイリングのオーバーヘッドを減らすために、Cythonを介して Cに実装されています。
from line_profiler import LineProfiler
import random
def do_stuff(numbers):
s = sum(numbers)
l = [numbers[i]/43 for i in range(len(numbers))]
m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()
結果は次のようになります。
Timer unit: 1e-06 s
Total time: 0.000649 s
File: <ipython-input-2-2e060b054fea>
Function: do_stuff at line 4
Line # Hits Time Per Hit % Time Line Contents
==============================================================
4 def do_stuff(numbers):
5 1 10 10.0 1.5 s = sum(numbers)
6 1 186 186.0 28.7 l = [numbers[i]/43 for i in range(len(numbers))]
7 1 453 453.0 69.8 m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
コード実行の一部を計るのに非常に単純な関数を使用しました:
import time
def timing():
start_time = time.time()
return lambda x: print("[{:.2f}s] {}".format(time.time() - start_time, x))
そしてそれを使用するには、関数のタイミングを取得するために測定するコードの前にそれを呼び出し、次にコメント付きのコードの後に関数を呼び出します。時間はコメントの前に表示されます。例えば:
t = timing()
train = pd.read_csv('train.csv',
dtype={
'id': str,
'vendor_id': str,
'pickup_datetime': str,
'dropoff_datetime': str,
'passenger_count': int,
'pickup_longitude': np.float64,
'pickup_latitude': np.float64,
'dropoff_longitude': np.float64,
'dropoff_latitude': np.float64,
'store_and_fwd_flag': str,
'trip_duration': int,
},
parse_dates = ['pickup_datetime', 'dropoff_datetime'],
)
t("Loaded {} rows data from 'train'".format(len(train)))
その後、出力は次のようになります。
[9.35s] Loaded 1458644 rows data from 'train'
多くの場所で同じ問題を抱えていたため、便利なパッケージを作成しましたhorology
。あなたはそれをインストールしてpip install horology
、エレガントな方法でそれを行うことができます:
from horology import Timing
with Timing(name='Important calculations: '):
prepare()
do_your_stuff()
finish_sth()
出力されます:
Important calculations: 12.43 ms
または、もっと簡単です(1つの関数がある場合)。
from horology import timed
@timed
def main():
...
出力されます:
main: 7.12 h
単位と丸めを処理します。Python 3.6以降で動作します。
main.interval
。
これは私にとって有効なポール・マクガイアの答えです。誰かがその問題を実行するのに問題があった場合に備えて。
import atexit
from time import clock
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
def secondsToStr(t):
return "%d:%02d:%02d.%03d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(t*1000,),1000,60,60])
line = "="*40
def log(s, elapsed=None):
print (line)
print (secondsToStr(clock()), '-', s)
if elapsed:
print ("Elapsed time:", elapsed)
print (line)
def endlog():
end = clock()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
def now():
return secondsToStr(clock())
def main():
start = clock()
atexit.register(endlog)
log("Start Program")
timing.main()
ファイルをインポートした後、プログラムから呼び出します。
Timeitは、小さなコードブロックの実行時間を計算するために使用されるPythonのクラスです。
Default_timerはこのクラスのメソッドで、CPU実行時間ではなく、実時間のタイミングを測定するために使用されます。したがって、他のプロセスの実行がこれを妨害する可能性があります。したがって、コードの小さなブロックに役立ちます。
コードのサンプルは次のとおりです。
from timeit import default_timer as timer
start= timer()
# Some logic
end = timer()
print("Time taken:", end-start)
timeit
多くの場合、IMOはより良い回答です。
後で答えますが、私は使用しますtimeit
:
import timeit
code_to_test = """
a = range(100000)
b = []
for i in a:
b.append(i*2)
"""
elapsed_time = timeit.timeit(code_to_test, number=500)
print(elapsed_time)
# 10.159821493085474
code_to_test
。number
引数は、コードを繰り返す回数を指定します。Pythonプログラムの実行時間の測定は、次の条件に応じて一貫性がない場合があります。
これは、最も効果的な方法は「成長の順序」を使用して、ビッグ「O」表記を学習して適切に実行することです。
とにかく、この単純なアルゴリズムを使用して、特定のマシンカウント/秒で任意のPythonプログラムのパフォーマンスを評価することができます。 これを、評価するプログラムに適合させます
import time
now = time.time()
future = now + 10
step = 4 # Why 4 steps? Because until here already four operations executed
while time.time() < future:
step += 3 # Why 3 again? Because a while loop executes one comparison and one plus equal statement
step += 4 # Why 3 more? Because one comparison starting while when time is over plus the final assignment of step + 1 and print statement
print(str(int(step / 10)) + " steps per second")
これは単にPythonで行います。複雑にする必要はありません。
import time
start = time.localtime()
end = time.localtime()
"""Total execution time in seconds$ """
print(end.tm_sec - start.tm_sec)
@rogeriopvlからの応答と同様に、長時間実行するジョブに対して同じライブラリを使用して、時間を秒に変換するように少し変更を加えました。
import time
start_time = time.time()
main()
seconds = time.time() - start_time
print('Time Taken:', time.strftime("%H:%M:%S",time.gmtime(seconds)))
出力例
Time Taken: 00:00:08
まず、管理者としてコマンドプロンプト(CMD)を開いて人に優しいパッケージをインストールし、そこに入力します-
pip install humanfriendly
コード:
from humanfriendly import format_timespan
import time
begin_time = time.time()
# Put your code here
end_time = time.time() - begin_time
print("Total execution time: ", format_timespan(end_time))
出力:
metakermitの Python 2.7用の最新の回答を使用するには、単調なパッケージが必要です。
コードは次のようになります。
from datetime import timedelta
from monotonic import monotonic
start_time = monotonic()
end_time = monotonic()
print(timedelta(seconds=end_time - start_time))
時間をマイクロ秒単位で測定したい場合は、Paul McGuireとNicojoの回答に完全に基づいた次のバージョンを使用できます。これはPython 3コードです。それに色も追加しました:
import atexit
from time import time
from datetime import timedelta, datetime
def seconds_to_str(elapsed=None):
if elapsed is None:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
else:
return str(timedelta(seconds=elapsed))
def log(txt, elapsed=None):
colour_cyan = '\033[36m'
colour_reset = '\033[0;0;39m'
colour_red = '\033[31m'
print('\n ' + colour_cyan + ' [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
if elapsed:
print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)
def end_log():
end = time()
elapsed = end-start
log("End Program", seconds_to_str(elapsed))
start = time()
atexit.register(end_log)
log("Start Program")
log()=>タイミング情報を出力する関数。
txt ==>ログの最初の引数、およびタイミングをマークする文字列。
atexit ==>プログラムの終了時に呼び出すことができる関数を登録するPythonモジュール。