我想在同一个程序中计算两种不同算法的运行时间。当我编写一个程序计算每个单独的运行时,我得到了非常不同的结果,所以为了测试这个新程序,我让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()
答案 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
,例如使用calc1
和calc2
的现有定义。