在 Python 中使用 timeit 计算运行时间的奇怪之处?
Oddity calculating runtime with timeit in Python?
我想计算同一个程序中两种不同算法的运行时间。当我编写程序分别计算每个算法的运行时间时,我得到了非常不同的结果,因此为了测试这个新程序,我 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()
我认为您一方面被 Windows 电源管理所困扰,另一方面,您的测试方法存在缺陷。
在第一种情况下,我 因为 Windows 默认情况下会限制 CPU 吞吐量以节省电量。目前,您计算出的 运行 次存在显着差异;这可以通过在 x = int(input("Input a number to be tested: "))
之后立即进行像 something = 5**1000000
这样的无意义计算来显着减少,以增加 CPU 资源。我讨厌 Windows 10,所以我不知道如何改变它;我需要检查您如何将“电源选项”移动到 "High Performance" 并删除 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
.
我想计算同一个程序中两种不同算法的运行时间。当我编写程序分别计算每个算法的运行时间时,我得到了非常不同的结果,因此为了测试这个新程序,我 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()
我认为您一方面被 Windows 电源管理所困扰,另一方面,您的测试方法存在缺陷。
在第一种情况下,我 x = int(input("Input a number to be tested: "))
之后立即进行像 something = 5**1000000
这样的无意义计算来显着减少,以增加 CPU 资源。我讨厌 Windows 10,所以我不知道如何改变它;我需要检查您如何将“电源选项”移动到 "High Performance" 并删除 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
.