我想计算一下我的电脑可以在一秒钟内完成counter += 1
次的次数。一种天真的方法如下:
from time import time
counter = 0
startTime = time()
while time() - startTime < 1:
counter += 1
print counter
问题是time() - startTime < 1
可能比counter += 1
贵得多。
有没有办法在我的算法中制作一个不那么“干净”的1秒样本?
答案 0 :(得分:9)
时间算法的常用方法是另一种方法:使用固定数量的迭代并测量完成它们所需的时间。执行此类计时的最佳方法是timeit
模块。
print timeit.timeit("counter += 1", "counter = 0", number=100000000)
请注意,时间counter += 1
似乎毫无意义。你想要达到什么目标?
答案 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。
我认为测量结果非常不准确,但可能是合理的近似值?
答案 2 :(得分:0)
我从未使用过time()库,但根据该代码我假设它计算秒数,那么如果在ctrl + C发生后进行/ sec计算怎么办?它会是这样的:
#! /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
当然,由于最后一次处理和中断信号之间的时间过长,它并不准确,但是让脚本运行的时间越多,它就越精确:)
答案 3 :(得分:0)
这是我的方法
import time
m = 0
timeout = time.time() + 1
while True:
if time.time() > timeout:
break
m = m + 1
print(m)