Python,numpy性能不一致

axr492tv  于 2023-05-17  发布在  Python
关注(0)|答案(1)|浏览(119)

我正在创建一个元胞自动机,并对代码进行性能测试。
我是这样做的:

while True:
    time_1 = perf_counter_ns()
    numpy.fnc1()
    time_2 = perf_counter_ns()
    numpy.fnc2()
    time_3 = perf_counter_ns()
    numpy.fnc3()
    time_4 = perf_counter_ns()
    numpy.fnc4()
    time_5 = perf_counter_ns()
    numpy.fnc5()
    time_6 = perf_counter_ns()
    numpy.fnc6()
    time_7 = perf_counter_ns()

    diff_1 = time_2 - time_1
    diff_2 = time_3 - time_2
    diff_3 = time_4 - time_3
    diff_4 = time_5 - time_4
    diff_5 = time_6 - time_5
    diff_6 = time_7 - time_6

    print(results)

但是,我发现运行时有些不一致。我做了一些更长的测试,大约8个小时。
似乎表演是“跳来跳去”:一个小时它跑得更快,然后更慢,在这一个小时内有更小的部分,当它更快,然后它更慢...
更令人不安的是,慢-快周期的长度随着时间的推移而延长。所以我很确定这不是一个常规的系统过程。
测试在debian 11 AMD Ryzen 5 2600六核处理器上进行
GUI正在运行,但没有浏览器等。我监控了整个处理器的使用情况,大多数核心都没有做任何事情。
请注意,它是一个细胞自动机,它在测试过程中进化,所以输入数据是不一样的,它不断变化。
不过,我不认为,根据数组中的数字,累加数组所需的时间会有什么不同……
此外,如果性能变化是数据驱动的,那么不太可能看到随机数据在整整一分钟内产生大约相同的运行时……

问题:我看到了什么???是什么导致的???

我的直觉是,也许它与python线程调度有关,但我不知道,如果numpy使用线程,而我的代码中只有1个线程...
平均而言,“较慢”和“较快”状态之间至少有2倍的性能差异,因此使代码保持在“较快”状态将非常有益。
我有两张图片:
其中一幅图像是diff_3的值,一个又一个周期,放大越来越多。
另一个图像是diff_1diff2,... diff_6,全部在1张图像中。在这个尺度下很难看到细节,但diff_3diff_5在某种程度上是可以比较的。正如你所看到的,“快”和“慢”的时间段是匹配的,但并不完全匹配。
在图像上有大约650万个周期。

rryofs0p

rryofs0p1#

我认为@slothrop的评论是在现场。
我做了一个更长的测试,测量了核心频率,温度,将其与执行速度进行比较,并绘制了一个校正的执行速度。
我也意识到,为什么热循环的周期在增长:我收集了内存中的数据,并定期转储所有数据(而不仅仅是追加)。随着收集的数据越来越多,保存时间也会增加,从而使处理器有更多的时间进行冷却。
在图像上:
CPU温度与循环执行时间。
原始循环执行时间与频率校正。两者都有100的长期移动平均线。为了更容易比较,校正数据系列的共同频率是平均核心频率。

相关问题