什么是timeit模块?
timeit模块是python的一个内置模块,它被用来在python代码中测量小段代码的执行时间。使用timeit模块可以得出某段代码的执行时间,从而可以比较不同代码实现方式的性能差异。timeit模块可以摆脱许多常见的程序执行时间测量陷阱,同时非常容易使用。
timeit模块的使用方法
以下是使用模块的基本步骤:
第一步:导入模块
import timeit
第二步:编写测试代码
在这一步中可以编写一段简单的代码来测试。
a = [i**2 for i in range(1000)]
第三步:使用timeit模块测试代码的性能
我们可以通过timeit的Timer方法来测试这段代码的执行时间。
t = timeit.Timer("a = [i**2 for i in range(1000)]")
第四步:执行测试
在这一步中,我们执行测试并获得实际的执行时间。
print(t.timeit())
这段代码执行了1000次,我们可以通过指定参数number的值来改变执行的次数。
print(t.timeit(number=100))
注意:timeit模块会默认执行1000000次,可以通过修改参数来改变默认行为
在上面的例子中,我们使用了timeit模块来测量一个简单列表推导式的执行时间。
使用setup参数
有时候我们需要在测试代码中定义一些变量,这时候我们可以使用setup参数在执行测试代码之前初始化这些变量。
t = timeit.Timer("x = range(100)", "from __main__ import range")
在这个例子中我们定义了一个x变量,并且通过setup参数将range函数引入到我们的测试代码中。
计算执行时间的平均值
有时候我们需要对某段代码的执行时间求平均值,来得到相对稳定的性能数据。
我们可以使用timeit模块中的repeat方法来计算某段代码的执行时间的平均值。
t = timeit.Timer("a = [i**2 for i in range(1000)]")
r = t.repeat(repeat=5, number=100)
在这个例子中,我们将代码执行了5次并且统计了每次执行的结果。
使用模块时需要注意的一些问题
在使用模块测试执行时间时需要注意一些缺点。主要包括:
缺点一:测试的代码中可能使用了全局变量
在测试代码中如果使用了全局变量,这种测试的性能数据可能并不准确。
缺点二:测试的代码可能执行太快而无法被测量
在Python中一些小的代码可能在执行前已经被缓存了,所以测试的性能数据无法准确反映每次执行的情况,或者在循环中多次执行的情况也可能会被缓存而无法准确测量。
在Python 2.x中如何使用timeit模块进行性能测试
在Python 2.x中我们可以使用如下方式来使用timeit模块进行性能测试
第一步:导入模块
import timeit
第二步:定义测试代码
在这一步中可以定义一段要测试的代码,例如下面这段计算列表平均值的代码。
import random
def avg(my_list):
return sum(my_list) / len(my_list)
my_list = [random.randint(0, 100) for _ in range(1000)]
第三步:使用timeit模块测试性能
通过timeit模块的Timer方法来设置参数并执行测试。
t = timeit.Timer(stmt='avg(my_list)',
setup='from __main__ import avg, my_list')
print t.timeit(number=1000)
总结
使用timeit模块可以方便地测量代码的性能,但是需要在具体使用时注意上述的限制,进一步掌握Module2.x中time模块的使用对待模块的学习及了解有很好的帮助。