我使用不同的SLEEP_TIME多次运行这段代码,例如SLEEP_TIME=0SLEEP_TIME=1e-3SLEEP_TIME=10e-3,并且还省略了时间.对于每SLEEP_TIME个值,测量的平均工作时间都会改变,即使睡眠在测量的代码之外.这对我来说毫无意义--为什么调用时间.睡眠会改变进程的行为方式even though the code absolutely does not depend on the sleep

我在Linux和Windows上测试了以下代码,它们的行为类似(尽管在Windows中完全省略睡眠会导致性能显著下降).

import numpy as np
import multiprocessing 
import time

SLEEP_TIME = 1e-3

def do_work():
    total_time = 0
    time_to_run = 500
    for i in range(time_to_run):
        t0 = time.time()
        
        # start work
        nparr = np.ones((1000,100,30))
        nparr[nparr == 0] = 1
        sp = nparr.shape # to synchronize previous call
        # end work
        
        t1 = time.time()                
        total_time += t1 - t0        
        time.sleep(SLEEP_TIME) # WHY DOES THIS MATTER???? THIS IS OUTSIDE THE WORK AND OUTSIDE MEASUREMENT
    
    print(f"avg work time: {1000 * total_time / time_to_run:.2f}ms")        

if __name__ == '__main__':
    
    p1 = multiprocessing.Process(target=do_work)        
    p1.start()
    p2 = multiprocessing.Process(target=do_work)        
    p2.start()

    p1.join()
    p2.join()
    

示例结果(在Linux上):

No sleep (commenting out time.sleep)

输出:

平均工作时间:4.50毫秒

平均工作时间:4.56毫秒

SLEEP_TIME = 0

输出:

平均工作时间:4.46毫秒

平均工作时间:4.52毫秒

SLEEP_TIME = 1e-3

输出:

平均工作时间:4.76毫秒

平均工作时间:4.82毫秒

SLEEP_TIME = 10e-3

输出:

平均工作时间:7.05毫秒

平均工作时间:7.07毫秒

这是怎么回事?操作系统是否在try (但失败了)优化我的进程?我如何才能尽可能快地执行工作部分,而不管之前的睡眠时间有多长?

ChatGPT建议我应该在文件的顶部添加:

import os
os.environ["OMP_NUM_THREADS"] = "1"  # or whatever number you choose

虽然它改善了大量Hibernate 的执行时间,但执行时间仍然延迟.

编辑:我修复了联接策略,就像一些人正确地建议的那样.尽管它不会影响所讨论的问题,但最好是正确编写代码以避免混淆.

推荐答案

我在我的Ubuntu机器上重现了您的python脚本的行为. 在我的例子中,它并不是特定于python的,我发现在每次计算之间Hibernate 的c++程序中也有类似的性能下降.

在Linux中,有各种机制可以降低CPU的频率(S),以便在系统负载较低时节省电能.在我的例子中,"CPU频率调节调节器"在所有CPU上都被设置为"POWERSAVE".您可以通过运行以下命令进行判断:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

在我的例子中,更改为"Performance"会产生类似的有睡眠和无睡眠的时间测量结果,现在测量的时间甚至比从"POWERSAVE"更改为"POWERSAVE"之前没有睡眠的测量时间还要短. 要更改这些设置,请运行:

echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

请注意,这将消耗更多电能,并可能导致产生更多热量,因此您可能希望监控CPU的温度,以确保它们不会过热.

Python相关问答推荐

KNN分类器中的GridSearchCV

DuckDB将蜂巢分区插入拼花文件

Polars:使用列值引用when / then表达中的其他列

如何根据日期和时间将状态更新为已过期或活动?

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

如何找到满足各组口罩条件的第一行?

如何从.cgi网站刮一张表到rame?

如何请求使用Python将文件下载到带有登录名的门户网站?

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

部分视图的DataFrame

如何从列表框中 Select 而不出错?

try 检索blob名称列表时出现错误填充错误""

lityter不让我输入左边的方括号,'

基于Scipy插值法的三次样条系数

Numpyro AR(1)均值切换模型抽样不一致性

关于两个表达式的区别

计算空值

如何反转一个框架中列的值?

如何将返回引用的函数与pybind11绑定?

Python协议不兼容警告