使用Python中的timeit计算运行时间的奇数?

时间:2017-10-17 17:53:30

标签: python algorithm runtime

我想在同一个程序中计算两种不同算法的运行时间。当我编写一个程序计算每个单独的运行时,我得到了非常不同的结果,所以为了测试这个新程序,我让python计算两次相同算法的运行时间。当我这样做时(在下面的程序中),我发现同一算法的运行时实际上是不同的!我缺少什么,如何解决这个问题,以便比较算法?

import timeit

def calc1(x):
    return x*x+x+1

def calc2(x):
    return x*x+x+1

def main():
    x = int(input("Input a number to be tested: "))
    start1 = timeit.default_timer()
    result1 = calc1(x)
    end1 = timeit.default_timer()

    start2 = timeit.default_timer()
    result2 = calc2(x)
    end2 = timeit.default_timer()

    print("Result of calculation 1 was {0}; time to compute was {1} seconds.".format(result1,end1-start1))
    print("Result of calculation 2 was {0}; time to compute was {1} seconds.".format(result2,end2-start2))
main()

1 个答案:

答案 0 :(得分:0)

我认为您在一个部分被Windows电源管理所困,第二部分,您的测试方法存在缺陷。

在第一种情况下,我also got bitten因为默认情况下Windows会限制CPU吞吐量以节省电量。目前,您计算的运行时间存在巨大差异;只需在something = 5**1000000之后立即使用x = int(input("Input a number to be tested: "))之类的无意义计算来增加CPU资源,就可以大大减少这种情况。我讨厌Windows 10,所以我不知道如何改变这一点。我需要检查一下你如何改变电源选项"到"高性能"并删除CPU限制(很快编辑),这将大大减少这个差距。

第二个问题是您只运行一个测试周期。你无法从中获得稳定的结果。相反,您需要多次迭代。例如,通过一百万次迭代,您会看到数字之间存在某些相似性:

import timeit

exec1 = timeit.timeit(stmt='def calc1():\n return x*x+x+1', number=1000000)
exec2 = timeit.timeit(stmt='def calc2():\n return x*x+x+1', number=1000000)

print("Execution of first loop: {}".format(exec1))
print("Execution of second loop: {}".format(exec2))

根据您的IDE(如果它是Canopy / Spyder),可以采用更简洁的方式运行timeit,例如使用calc1calc2的现有定义。