Python中的算法计时

时间:2012-02-15 16:41:12

标签: python

我想计算一下我的电脑可以在一秒钟内完成counter += 1次的次数。一种天真的方法如下:

from time import time

counter = 0
startTime = time()

while time() - startTime < 1:
    counter += 1

print counter

问题是time() - startTime < 1可能比counter += 1贵得多。

有没有办法在我的算法中制作一个不那么“干净”的1秒样本?

4 个答案:

答案 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)