Python中的算法计时

1 投票
4 回答
5178 浏览
提问于 2025-04-17 13:05

我想计算我的电脑在一秒钟内能执行多少次 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 的时间似乎没什么意义。你想要达到什么目的呢?

撰写回答