关于Timing代码块:代码的时序块 – Python

Timing blocks of code - Python

本问题已经有最佳答案,请猛点这里访问。

我正在尝试测量在Python中运行一组指令所需的时间,但我不想写下这样的内容:

1
2
3
4
5
start = time.clock()
...
<lines of code>
...
time_elapsed = time.clock() - start

相反,我想知道是否有一种方法可以将指令块作为参数发送给返回已用时间的函数,如

1
time_elapsed = time_it_takes(<lines of code>)

这种方法的实现可能是这样的

1
2
3
4
def time_it_takes(<lines of code>):
  start = time.clock()
  result = <lines of code>
  return (result, time.clock() - start)

有人知道我是否有办法做到这一点? 提前致谢。


这将很好地利用装饰器。你可以写一个像这样做的装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)

        print('The function ran for', time.time() - start)
    return wrapper


@timer
def just_sleep():
    time.sleep(5)

just_sleep()

产量

1
The function ran for 5.0050904750823975

然后你可以用@timer装饰你想要计时的任何函数,你也可以在装饰器里面做一些其他奇特的事情。就像函数运行超过15秒做一些事情......否则做另一件事

注意:这不是测量python中函数执行时间的最准确方法


您可以构建自己的上下文管理器来为相对较长的代码计时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import time

class MyTimer(object):

    def __enter__(self):
        self.start = time.clock()
        return self

    def __exit__(self, typ, value, traceback):
        self.duration = time.clock() - self.start

with MyTimer() as timer:
    time.sleep(3)
print(timer.duration)

但要小心你测量的是什么。在Windows time.clock是一个高分辨率的挂钟时间,但在Linux上它的CPU运行时间。


如果您使用IPython,这是一件好事,您可以将代码构造为单行,即函数调用:

1
%timeit your-code

这对我来说很方便。希望能帮助到你。


使用python -m cProfile myscript.py它??提供了关于方法的时间消耗的完整日志。