您的位置:首页 > 编程语言 > Python开发

python程序运行时间的几种分析方法

2017-08-15 18:10 441 查看
    在实际问题中,可能会遇到比较解决同一问题的不同方法之间的性能差异。而Python 提供了一个度量工具,为这些问题提供了直接答案。

    从查阅资料的情况来看,测试运行时间的调用的模块主要有:time,timeit,datetime,profile 和pstats。其中,profile 和pstats模块提供了针对更大代码块的时间度量工具。以下主要以time,timeit,datetime为例进行说明。


1 time模块测试程序运行时间

   
在time模块中,计算时间的函数有两个time()和clock()。其中,time(time.time(),time返回的是UTC时间(seconds
since the 00:00:00 UTC on January 1)。在很多系统,包括windows下精度很差,win32下的精度只有1/18.2秒。不过在Unix/Linux系统下,time()的精度还是很高的。)time()是计算现实世界的时间,而clock()是cpu
时钟。如果程序计算量不是很大,time()可能无法计算时间,从而导致程序测试失败。而clock()是利用cpu
时钟,时间计算精度较高。对比测试程序如下:

import time
#利用time.clock()计时测试
start_time1 = time.clock()
i = 0
string = 'ILoveFishC.com'
while i < len(string):
print(i,  end=' ')
i += 1
end_time1 = time.clock()
time1 = end_time1-start_time1
print('\nRunning time1:', time1)
#利用time.time()计时测试
start_time2 = time.time()
i = 0
string = 'ILoveFishC.com'
while i < len(string):
print(i,  end=' ')
i += 1
end_time2 = time.time()
time2 = end_time2-start_time2
print('\nRunning time2:', time2)
输出结果为:

0 1 2 3 4 5 6 7 8 9 10 11 12 13
Running time1: 3.2431984176475974e-05
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Running time2: 0.0
从中可以看出,time.time()用于测试运行时间是有限的,对于某些较短或运算量不大的程序是无法测量的。

2
timeit模块测试程序运行时间

timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和 1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000))
你可以在命令行使用 timeit 模块来测试一个已存在的 Python 程序,而不需要修改代码。

from timeit import Timer
print(Timer("sum(range(100))").timeit())


输出结果为:
1.547405913377044

3 datetime模块测试程序运行时间

datetime同样是基于现实时钟的,同样是针对于运算量较大的程序,使用方法如下:import datetime
def time_1():
begin = datetime.datetime.now()
sum(range(10000000))
end = datetime.datetime.now()
time = end - begin
return time

print(time_1())输出结果为:

0:00:00.470582
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: