在python中测量脚本运行时间

Measure script running time in Python

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

我有这个问题很长一段时间了,我在几个地方寻找了答案,但没有成功。

我的问题是:如何衡量给定脚本完全完成所需的时间?

假设我有一个愚蠢的脚本来计算从0到10^12的所有数字之和:

1
2
3
4
x = 0
for i in range(pow(10,12)):
    x += i
print(x)

我怎么知道我的电脑花了多少时间才能完成?

事先谢谢,拉塞罗


您可以使用python profiler cprofile来测量CPU时间以及每个函数内部花费的时间以及调用每个函数的次数。如果您想在不知道瓶颈在哪里的情况下提高脚本的性能,这非常有用。对另一个问题的回答是很好的。看一下医生也很好。

下面是一个如何从命令行使用cprofile分析脚本的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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}

如果您正在寻找一个有用的一行程序,并且正在使用ipython,那么%timeitmagic函数可能很有用(在链接的帖子中没有提到这一点,因此为了完整性而添加它):

1
%timeit [x for x in range(1000)]

给予(在我的机器上):

1
10000 loops, best of 3: 37.1 μs per loop

对于您的脚本,我将首先定义一个函数:

1
2
3
4
5
def sumx(y,z):
    x = 0
    for i in range(pow(y,z)):
        x += 1
    print(x)

然后这样做:

1
%timeit sumx(5,7)

它给出:

1
100 loops, best of 3: 4.85 ms per loop


我已经知道你可以做一件聪明的事:

1
2
3
4
5
6
import time
# at the beginning:
start_time = time.time()

# at the end of the program:
print("%f seconds" % (time.time() - start_time))

它不是100%准确,但对我来说是相当好的