1753

私が望むのは、コードのどこかで時間のカウントを開始してから、経過した時間を取得して、いくつかの関数を実行するのにかかった時間を測定することです。timeit モジュールを間違って使用していると思いますが、ドキュメントは私にとって混乱を招くだけです。

import timeit

start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)
4

37 に答える 37

2092

2 点間の経過時間を測定したいだけの場合は、次のように使用できます time.time()

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

これにより、実行時間が秒単位で示されます。

3.3以降の別のオプションは、要件に応じてperf_counterまたはを使用することです。process_time3.3 より前では使用が推奨されていました( Ambertime.clockに感謝します)。ただし、現在は推奨されていません。

Unix では、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同じ名前の C 関数の精度に依存します。

Windows では、この関数は、Win32 関数に基づいて、この関数を最初に呼び出してから経過した壁時計の秒数を浮動小数点数として返しますQueryPerformanceCounter()。通常、分解能は 1 マイクロ秒よりも優れています。

バージョン 3.3 以降非推奨: この関数の動作はプラットフォームに依存します:明確に定義された動作を行うには、要件に応じてorを代わりに使用してください。perf_counter()process_time()

于 2011-09-10T09:26:56.040 に答える
969

timeit.default_timerの代わりに使用しtimeit.timeitます。前者は、使用しているプラ​​ットフォームとバージョンの Python で利用可能な最適なクロックを自動的に提供します。

from timeit import default_timer as timer

start = timer()
# ...
end = timer()
print(end - start) # Time in seconds, e.g. 5.38091952400282

timeit.default_timerは、OS に応じて time.time() または time.clock() に割り当てられます。Python 3.3 以降では、 default_timerはすべてのプラットフォームでtime.perf_counter()です。Python - time.clock() と time.time() - 精度を参照してください。

以下も参照してください。

于 2014-09-13T13:54:38.937 に答える
97

時間を計りたい機能を考えると、

test.py:

def foo(): 
    # print "hello"   
    return "hello"

最も簡単な使用方法timeitは、コマンド ラインから呼び出すことです。

% python -mtimeit -s'import test' 'test.foo()'
1000000 loops, best of 3: 0.254 usec per loop

関数の速度を比較するためにtime.timeorを (素朴に)使用しようとしないでください。誤解を招く結果になる可能性がありますtime.clock

PS。時間を計測したい関数に print ステートメントを入れないでください。そうしないと、測定される時間は端末の速度に依存します。

于 2011-09-10T10:04:03.217 に答える
56

操作の所要時間を計算する最も簡単な方法:

import time

start_time = time.monotonic()

<operations, programs>

print('seconds: ', time.monotonic() - start_time)

公式ドキュメントはこちら

于 2020-05-30T18:08:08.093 に答える
30

実行の測定に使用time.timeすると、コンピューター上の他のプロセスによって費やされた実行時間を含む、コマンドの全体的な実行時間が得られます。これはユーザーが気付く時間ですが、異なるコードスニペット/アルゴリズム/関数/..を比較したい場合は良くありません。

詳細情報timeit

プロファイリングについてより深い洞察が必要な場合:

更新:昨年、http://pythonhosted.org/line_profiler/を頻繁に使用しましたが、非常に役立ち、Pythonプロファイルモジュールの代わりに使用することをお勧めします

于 2011-09-10T09:38:51.437 に答える
21

タイミング コードの別のコンテキスト マネージャーを次に示します。

使用法:

from benchmark import benchmark

with benchmark("Test 1+1"):
    1+1
=>
Test 1+1 : 1.41e-06 seconds

または、時間値が必要な場合

with benchmark("Test 1+1") as b:
    1+1
print(b.time)
=>
Test 1+1 : 7.05e-07 seconds
7.05233786763e-07

ベンチマーク.py :

from timeit import default_timer as timer

class benchmark(object):

    def __init__(self, msg, fmt="%0.3g"):
        self.msg = msg
        self.fmt = fmt

    def __enter__(self):
        self.start = timer()
        return self

    def __exit__(self, *args):
        t = timer() - self.start
        print(("%s : " + self.fmt + " seconds") % (self.msg, t))
        self.time = t

http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.htmlから適応

于 2016-12-31T13:03:03.560 に答える
20

「hh:mm:ss」文字列を返す小さなタイマー クラスを次に示します。

class Timer:
  def __init__(self):
    self.start = time.time()

  def restart(self):
    self.start = time.time()

  def get_time_hhmmss(self):
    end = time.time()
    m, s = divmod(end - self.start, 60)
    h, m = divmod(m, 60)
    time_str = "%02d:%02d:%02d" % (h, m, s)
    return time_str

使用法:

# Start timer
my_timer = Timer()

# ... do something

# Get time string:
time_hhmmss = my_timer.get_time_hhmmss()
print("Time elapsed: %s" % time_hhmmss )

# ... use the timer again
my_timer.restart()

# ... do something

# Get time:
time_hhmmss = my_timer.get_time_hhmmss()

# ... etc
于 2016-02-04T10:49:41.693 に答える
19

プロファイラー モジュールを使用します。非常に詳細なプロファイルを提供します。

import profile
profile.run('main()')

それは次のようなものを出力します:

          5 function calls in 0.047 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(exec)
        1    0.047    0.047    0.047    0.047 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.047    0.047 profile:0(main())
        1    0.000    0.000    0.000    0.000 two_sum.py:2(twoSum)

とても参考になりました。

于 2017-07-18T23:19:03.370 に答える
18

(Ipython のみ) %timeitを使用して平均処理時間を測定できます。

def foo():
    print "hello"

その後:

%timeit foo()

結果は次のようになります。

10000 loops, best of 3: 27 µs per loop
于 2014-11-24T14:25:12.703 に答える
11

python3:

from time import sleep, perf_counter as pc
t0 = pc()
sleep(1)
print(pc()-t0)

エレガントで短い。

于 2016-01-15T07:15:25.900 に答える
6

このためのライブラリを作成しました。関数を測定したい場合は、このようにするだけです


from pythonbenchmark import compare, measure
import time

a,b,c,d,e = 10,10,10,10,10
something = [a,b,c,d,e]

@measure
def myFunction(something):
    time.sleep(0.4)

@measure
def myOptimizedFunction(something):
    time.sleep(0.2)

myFunction(input)
myOptimizedFunction(input)

https://github.com/Karlheinzniebuhr/pythonbenchmark

于 2015-05-04T17:02:23.773 に答える
4

ラムダとして、経過時間とタイム スタンプを取得します。

import datetime
t_set = lambda: datetime.datetime.now().astimezone().replace(microsecond=0)
t_diff = lambda t: str(t_set() - t)
t_stamp = lambda t=None: str(t) if t else str(t_set())

実際には:

>>> 
>>> t_set()
datetime.datetime(2021, 3, 21, 1, 25, 17, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=61200), 'PDT'))
>>> t = t_set()
>>> t_diff(t)
'0:00:14'
>>> t_diff(t)
'0:00:23'
>>> t_stamp()
'2021-03-21 01:25:57-07:00'
>>> t_stamp(t)
'2021-03-21 01:25:22-07:00'
>>> 
于 2021-03-21T08:20:08.277 に答える
0

時間は、次のように %timeit マジック関数で測定することもできます。

%timeit -t -n 1 print("hello")

n 1機能を1回だけ実行するためのものです。

于 2020-02-26T06:17:53.417 に答える