131

所以在Java中,我们可以做How to measure time by a function to execute

但是它是如何在 python 中完成的呢?要测量代码行之间的时间开始和结束时间?这样做的东西:

import some_time_library

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

time_taken = endtime - starttime
4

10 回答 10

201

如果要测量 CPU 时间,可以使用time.process_time()Python 3.3 及更高版本:

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

第一次通话会打开计时器,第二次通话会告诉您已经过了多少秒。

还有一个 function time.clock(),但自 Python 3.3 起已弃用,将在 Python 3.8 中删除。

有更好的分析工具,例如timeitand profile,但是 time.process_time() 将测量 CPU 时间,这就是您要问的。

如果您想改为测量挂钟时间,请使用time.time().

于 2013-01-22T05:34:22.113 回答
73

您还可以使用time库:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')
于 2019-01-16T09:06:18.627 回答
35

借助一个小型便利类,您可以测量在缩进行中花费的时间,如下所示:

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

在缩进的行完成执行后将显示以下内容:

Code block took: x.xxx ms

更新:您现在可以使用pip install linetimerthen获取课程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 版本的最佳计时器,请参阅此答案

于 2018-10-10T22:49:11.663 回答
16

我总是喜欢以小时、分钟和秒 (%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
于 2019-05-28T14:05:16.047 回答
15

将代码放入函数中,然后使用装饰器进行计时是另一种选择。( Source ) 这种方法的优点是您定义了一次计时器,然后为每个函数使用一个简单的附加行

首先,定义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. 欢迎评论。

于 2020-08-31T05:11:32.063 回答
6

我正在寻找一种如何用最少的代码输出格式化时间的方法,所以这是我的解决方案。无论如何,很多人都使用 Pandas,所以在某些情况下,这可以节省额外的库导入。

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()每个回路输出 154 ns ± 13.3 ns

于 2019-11-27T06:31:40.143 回答
2

你也可以试试这个:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0
于 2020-05-07T11:01:25.527 回答
0

让我在https://stackoverflow.com/a/63665115/7412781解决方案中添加更多内容。

  • 删除了对functools.
  • 使用的进程时间time.process_time()而不是绝对计数器,time.perf_counter()因为进程可以通过内核进行上下文切换。
  • 也使用原始函数指针打印来获取正确的类名。

这是装饰器代码。

import time

def decorator_time_taken(fnc):
    def inner(*args):
        start = time.process_time()
        ret = fnc(*args)
        end = time.process_time()
        print("{} took {} seconds".format(fnc, round((end - start), 6)))
        return ret
    return inner

这是使用示例代码。它正在检查 193939 是否为素数。

class PrimeBrute:
    @decorator_time_taken
    def isPrime(self, a):
        for i in range(a-2):
           if a % (i+2) == 0: return False
        return True

inst = PrimeBrute()
print(inst.isPrime(193939))

这是输出。

<function PrimeBrute.isPrime at 0x7fc0c6919ae8> took 0.015789 seconds
True
于 2022-02-16T15:36:56.693 回答
0

使用timeit模块来衡量你的表现:

def test():
    print("test")
    emptyFunction()
    for i in [x for x in range(10000)]:
        i**i


def emptyFunction():
    pass

if __name__ == "__main__":
    import timeit
    print(timeit.timeit("test()", number = 5, globals = globals()))
    #print(timeit.timeit("test()", setup = "from __main__ import test",
    #    number = 5))

test第一个参数定义了我们在这种情况下要执行的代码段,并number定义了您想要重复执行的次数。

输出:

test
test
test
test
test
36.81822113099952
于 2022-02-26T02:28:15.297 回答
0

使用模块time,我们可以在函数开始和函数结束时计算 unix 时间。下面是代码的样子:

from time import time as unix

此代码导入time.time允许我们计算 unix 时间。

from time import sleep

这不是强制性的,但我也在time.sleep为其中一个演示导入。

START_TIME = unix()

这就是计算 unix 时间并将其放入变量中的方法。请记住,函数 unix 不是实际函数。我是time.time作为 unix 导入的,所以如果你没有放入as unix第一个导入,你将需要使用time.time().

在此之后,我们放置我们想要的任何函数或代码。在我们放置的代码片段的末尾

TOTAL_TIME = unix()-START_TIME

这行代码做了两件事:它在函数结束时计算 unix 时间,并且使用START_TIME之前的变量,我们计算执行代码片段所花费的时间。

然后我们可以在任何我们想要的地方使用这个变量,包括print()函数。

print("The snippet took {} seconds to execute".format(TOTAL_TIME))

这里我写了一个快速演示代码,其中有两个实验作为演示。(完整评论)

from time import time as unix # Import the module to measure unix time
from time import sleep

# Here are a few examples:
# 1. Counting to 100 000
START_TIME = unix()
for i in range(0, 100001):
  print("Number: {}\r".format(i), end="")
TOTAL_TIME = unix() - START_TIME
print("\nFinal time (Expirement 1): {} s\n".format(TOTAL_TIME))

# 2. Precision of sleep
for i in range(10):
  START_TIME = unix()
  sleep(0.1)
  TOTAL_TIME = unix() - START_TIME
  print("Sleep(0.1): Index: {}, Time: {} s".format(i,TOTAL_TIME))

这是我的输出:

Number: 100000
Final time (Expirement 1): 16.666812419891357 s

Sleep(0.1): Index: 0, Time: 0.10014867782592773 s
Sleep(0.1): Index: 1, Time: 0.10016226768493652 s
Sleep(0.1): Index: 2, Time: 0.10202860832214355 s
Sleep(0.1): Index: 3, Time: 0.10015869140625 s
Sleep(0.1): Index: 4, Time: 0.10014724731445312 s
Sleep(0.1): Index: 5, Time: 0.10013675689697266 s
Sleep(0.1): Index: 6, Time: 0.10014677047729492 s
Sleep(0.1): Index: 7, Time: 0.1001439094543457 s
Sleep(0.1): Index: 8, Time: 0.10044598579406738 s
Sleep(0.1): Index: 9, Time: 0.10014700889587402 s
> 
于 2022-03-04T20:42:42.570 回答