1

我正在测试几种不同的算法(用于解决 16x16 数独),使用 timeit 模块测量它们的性能。但是,似乎实际上只计算了第一次 timeit.repeat() 迭代,因为其他迭代变得更快。使用 t.repeat(repeat=10, number=1) 测试单个算法,得到以下结果:

[+] 结果......:solve1(函数1/1)
[+] 最快............:0.00003099
[+] 最慢............: 32.38717794
[+] 平均值*............:0.00003335(平均值计算,不含最小值/最大值)

10 个结果中的第一个总是需要更长的时间才能完成,这似乎只能通过 timeit.repeat() 循环的第 2 到 10 次迭代以某种方式使用循环先前迭代的缓存结果这一事实来解释。当在 for 循环中实际使用 timeit.repeat() 来比较几种算法时,似乎只计算了一次难题的解决方案:

[+] 结果......:solve1(函数 1/3)
[+] 最快............:0.00003099
[+] 最慢............: 16.33443809
[+] 平均*.......: 0.00003263(平均计算没有最小值/最大值)

[+] 结果......:solve2(函数2/3)
[+] 最快............:0.00365305
[+] 最慢............: 0.02915907
[+] 平均值*.........:0.00647599(平均值计算,不含最小值/最大值)

[+] 结果......:solve3(函数3/3)
[+] 最快............:0.00659299
[+] 最慢............: 0.02440906
[+] 平均值*.........:0.00717765(平均值计算,不含最小值/最大值)

真正奇怪的是算法的相对速度(相对于彼此)在整个测量过程中是一致的,这表明所有算法都在计算它们自己的结果。由于大部分中间结果(在计算第一个解决方案时获得)仍然在某种缓存中,由 python 进程保留,因此性能的这种极端提高?

任何帮助/见解将不胜感激。

4

1 回答 1

2

我认为内存分配是问题所在。

python解释器本身拥有一个内存池,它从没有(或很少?)内存池开始。在你的程序第一次运行之后,分配了很多内存(从系统中)并释放(到池中),然后接下来的运行从池中获取内存,这比从系统中请求内存要快得多。

但这只有在您的算法会消耗大量内存时才有意义。

于 2012-06-12T10:13:19.620 回答