Python中的算法计时
我想计算我的电脑在一秒钟内能执行多少次 counter += 1
。一个简单的方法是这样做:
from time import time
counter = 0
startTime = time()
while time() - startTime < 1:
counter += 1
print counter
不过,问题是 time() - startTime < 1
这个计算可能比 counter += 1
要耗费更多的时间。
有没有什么办法可以让我的算法在一秒内的样本更“简单”一些呢?
4 个回答
0
我之前从来没有用过time()这个库,但根据这段代码,我猜它是用来计算秒数的。那么如果在按下Ctrl+C之后再进行每秒的计算,会怎么样呢?大概是这样的:
#! /usr/bin/env python
from time import time
import signal
import sys
#The ctrl+C interruption function:
def signal_handler(signal, frame):
counts_per_sec = counter/(time()-startTime)
print counts_per_sec
exit(0)
signal.signal(signal.SIGINT, signal_handler)
counter = 0
startTime = time()
while 1:
counter = counter + 1
当然,这样计算出来的结果不会完全准确,因为在最后一秒处理完和收到中断信号之间会有一些时间差。但如果你让这个脚本运行的时间越长,结果就会越精确哦 :)
1
为什么不直接推算时间呢?你可以运行类似下面的代码:
from datetime import datetime
def operation():
counter = 0
tbeg = datetime.utcnow()
for _ in range(10**6):
counter += 1
td = datetime.utcnow() - tbeg
return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10.0**6
def timer(n):
stack = []
for _ in range(n):
stack.append(operation()) # units of musec/increment
print sum(stack) / len(stack)
if __name__ == "__main__":
timer(10)
这样就能得到每次增加所花费的平均微秒数;我得到的是0.09(可能非常不准确)。那么,如果我知道每次增加需要0.09微秒,那我就可以推算出在一秒钟内大约能增加11258992次。
我觉得这些测量结果可能不太准确,但也许这是一个合理的近似值?
10
通常,我们测量算法的时间是反过来的:先设定一个固定的循环次数,然后测量完成这些循环需要多长时间。最好的方法是使用timeit
这个模块。
print timeit.timeit("counter += 1", "counter = 0", number=100000000)
不过,测量 counter += 1
的时间似乎没什么意义。你想要达到什么目的呢?