【问题标题】:Python timeit: results cached instead of calculated?Python timeit:结果缓存而不是计算?
【发布时间】:2012-06-15 04:51:13
【问题描述】:

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

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

10 个结果中的第一个总是需要更长的时间才能完成, 这似乎只能通过迭代 2 到 10 的事实来解释 timeit.repeat() 循环以某种方式使用循环先前的缓存结果 迭代。在 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 caching timeit


【解决方案1】:

我认为是内存分配问题。

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

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

【讨论】:

  • 所有经过测试的算法都具有最小的内存要求:
  • 所有算法都使用恒定数量的空间/内存。它们是几种局部搜索算法的实现:solve1() 实现“迭代局部搜索”,solve2() 和 solve3() 是“模拟退火”的变体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2016-01-19
  • 2011-06-29
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多