我使用不同的SLEEP_TIME
多次运行这段代码,例如SLEEP_TIME=0
、SLEEP_TIME=1e-3
、SLEEP_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 的执行时间,但执行时间仍然延迟.
编辑:我修复了联接策略,就像一些人正确地建议的那样.尽管它不会影响所讨论的问题,但最好是正确编写代码以避免混淆.