有时候我们需要知道自己的代码运行了多久,time模块的方法提供了这个功能,但是不很准确,例如下面的代码,当循环次数小的时候得到的结果为0,显然这是不可能的。
import time
def test(v):
"""Stupid test function"""
return sum(v)
if __name__ == '__main__':
starttime = time.time()
for i in range(10000):
test(range(100))
endtime = time.time()
print('Time used....')
print(endtime-starttime)
更精确的方法是使用timeit模块中的类或方法,例如下面的代码:
import timeit
def test(v):
"""Stupid test function"""
return sum(v)
if __name__ == '__main__':
print('Time used.....')
print(timeit.timeit("test(range(100))", setup="from __main__ import test", number=10000))
该模块还可以这样用:
>>> t = timeit.Timer('(str(n) for n in range(100))')
>>> t.timeit(number=100000)
0.0895908122711262
>>> t.repeat(number=100000,repeat=3)
[0.10704452514619334, 0.08236811438837321, 0.08216938445730193]
或者这样用:
>>> timeit.repeat('(str(n) for n in range(100))',repeat=5)
[0.8461880084669247, 0.8362863440197543, 0.821552027900907, 0.8418989873480314, 0.81309776424132]
或者这样用:
>>> timeit.timeit('[str(n) for n in range(100)]', number=1000000)
26.671083924054642
>>> timeit.timeit('(str(n) for n in range(100))', number=1000000)
0.833847470578462
>>> timeit.timeit('map(str, range(100))', number=1000000)
0.6070823118230919
或者这样用:
>>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
0.41440500499993504
>>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
1.7246671520006203
咦,我们发现了什么?实现同样的功能,不同写法的执行效率差很多哦,当然这只是一个优化的地方,以后陆续整理Python代码优化的其他原理和思路。