Pythonでコードの行間でかかる時間を測定する方法は?


101

したがって、Javaでは、関数の実行にかかる時間を測定する方法を実行できます。

しかし、それはPythonでどのように行われますか?コード行間の時間の開始時間と終了時間を測定するには?これを行う何か:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

回答:


158

CPU時間を測定する場合はtime.process_time()、Python3.3以降で使用できます。

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

最初の呼び出しでタイマーがオンになり、2番目の呼び出しで何秒経過したかがわかります。

そこ機能もあるtime.clock()が、それはされたのPython 3.3から非推奨とPython 3.8で削除されます。

以下のような優れたプロファイリングツールがありますtimeitprofile、しかしtime.process_time()はCPU時間を測定し、これはあなたがについて尋ねているしているものであるが。

代わりに壁時計時間を測定する場合は、を使用しますtime.time()


53
これは使用方法ではなく、UnixではCPU時間time.clock()time.clock()測定しますが、Windowsでは実時間を測定します。time.time()OSによって動作が変わらない場所で使用することをお勧めします。stackoverflow.com/questions/85451/...
ティム・

4
よく観察します、@ Tim。ただし、同じ質問に関する別の投稿では、time.clock()のpython docで、「これはPythonまたはタイミングアルゴリズムのベンチマークに使用する関数です」と引用しています。実際に何を測定したいのかという問題になると思います。
Yevgen Yampolskiy 2013年

1
time.time()の非常に悪い点は、time sunchronization ntpdateなどの影響を受けることです。このため、time.clock()が唯一の信頼できる代替手段になると思います
www.jensolsson.se 2016

4
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
ismailarilik 2018

2
うーん...何が間違っているのかわからない。交換# your code heretime.sleep(10)て0.0秒になりました。追加for i in range(10000):/passしても同じ結果が得られました。私が試したどのような状況でも、time.process_time()常に同じ番号を返します。time.perf_counter()しかし、使用して期待される結果が得られました
biscuit3 1420年

58

timeライブラリを使用することもできます。

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@ Hayat-このメソッドは、UTCで、エポックからの秒数で表される浮動小数点数として時間を返します。[ docs.python.org/3/library/time.html]
AnumoySutradhar19年

@AnumoySutradharは実際にはそうではありません。エポックからエポックを差し引くため、2つの時間の時間差が得られます。
Nasta

28

小さな便利なクラスの助けを借りて、次のようにインデントされた行で費やされた時間測定できます。

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

インデントされた行の実行が終了すると、次のように表示されます。

Code block took: x.xxx ms

更新:クラスをpip install linetimerとで取得できるようになりましたfrom linetimer import CodeTimerこのGitHubプロジェクトを参照してください。

上記のクラスのコード:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

次に測定するコードブロックに名前を付けることができます。

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

そしてそれらを入れ子にします:

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

に関してはtimeit.default_timer()、OSとPythonのバージョンに基づいて最適なタイマーを使用しますこの回答を参照してください。


11

私は常に時間を時間、分、秒(%H:%M:%S)形式でチェックすることを好みます:

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

出力:

Time:  0:00:00.000019

3

最小限のコードでフォーマットされた時間を出力する方法を探していたので、これが私の解決策です。とにかく多くの人がパンダを使用しているので、場合によっては、追加のライブラリインポートから節約できます。

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

出力:

0 days 00:05:32.541600

時間の精度が最も重要でない場合はこれを使用することをお勧めしtimeます。それ以外の場合はライブラリを使用します。

%timeit pd.Timestamp.now() 出力3.29µs±214 ns /ループ

%timeit time.time() ループあたり154ns±13.3nsを出力


3

コードを関数に入れてから、タイミングにデコレータを使用することも別のオプションです。(ソース)この方法の利点は、タイマーを1回定義し関数ごとに単純な追加行で使用できることです。

まず、timerデコレータを定義します。

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

次に、関数を定義するときにデコレータを使用します。

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

やってみよう:

doubled_and_add(100000)
doubled_and_add(1000000)

出力:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

注:のtime.perf_counter代わりに使用する理由がわかりませんtime.time。コメントは大歓迎です。


1

これも試すことができます:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.