Python 每个进程的速度随着进程的增多而变慢

Python 每个进程的速度随着进程的增多而变慢,python,multiprocess,Python,Multiprocess,我正试图通过多进程来提高某些代码的速度。我注意到速度并没有像预期的那样增加。我知道子进程的产生会有开销,父进程和子进程之间的数据传输也会有开销。然而,即使在我最小化了开销之后,多进程的性能仍然不是我所期望的。因此,我编写了一个简单的测试代码: import multiprocessing import numpy as np import time def test_function(): start_time = time.time() n = 1000 x = np

我正试图通过多进程来提高某些代码的速度。我注意到速度并没有像预期的那样增加。我知道子进程的产生会有开销,父进程和子进程之间的数据传输也会有开销。然而,即使在我最小化了开销之后,多进程的性能仍然不是我所期望的。因此,我编写了一个简单的测试代码:

import multiprocessing
import numpy as np
import time

def test_function():
    start_time = time.time()
    n = 1000
    x = np.random.rand(n,n)
    p = np.random.rand(n,n)
    y = 0
    for i in range(n):
        for j in range(n):
            y += np.power(x[i][j], p[i][j])

    print ("= Running time:",time.time()-start_time)
    return 

def main():
    procs = [1,2,3,4,5,6]
    for proc in procs:
        print("Number of process:", proc)
        pool = multiprocessing.Pool(processes=proc)
        para = [(),] * proc
        pool.starmap(test_function,para)
        pool.close()
        pool.join()

if __name__ == '__main__':
    main()
您可以看到测试函数只有两个循环和一些数学计算。主进程和子进程之间没有数据传输,时间是在子进程内部计算的,因此不包括开销。以下是输出:

Number of process: 1
= Running time: 4.253360033035278
Number of process: 2
= Running time: 4.404280185699463
= Running time: 4.411274671554565
Number of process: 3
= Running time: 4.580170154571533
= Running time: 4.59316349029541
= Running time: 4.610152959823608
Number of process: 4
= Running time: 4.908967733383179
= Running time: 4.926954030990601
= Running time: 4.997913122177124
= Running time: 5.09885048866272
Number of process: 5
= Running time: 5.406658172607422
= Running time: 5.441636562347412
= Running time: 5.4576287269592285
= Running time: 5.473618030548096
= Running time: 5.621527671813965
Number of process: 6
= Running time: 6.195171594619751
= Running time: 6.225149869918823
= Running time: 6.256133079528809
= Running time: 6.290108919143677
= Running time: 6.339082717895508
= Running time: 6.3710620403289795
该代码在Windows 10下执行,使用4核8逻辑进程的i7 CPU。显然,每个进程的运行时间随着进程数量的增加而增加。这是由操作系统或CPU本身或其他硬件的限制引起的吗

更新:这是Linux环境下的输出。有趣的是,在5个过程中,2个过程的时间有较大的跳跃,而在6个过程中,4个过程的时间有较大的跳跃。似乎它与逻辑处理器有关?物理内核需要切换/交换逻辑处理器的源

Number of process: 1
= Running time: 4.039047479629517
Number of process: 2
= Running time: 4.150756597518921
= Running time: 4.159530878067017
Number of process: 3
= Running time: 4.228744745254517
= Running time: 4.261997938156128
= Running time: 4.324823379516602
Number of process: 4
= Running time: 4.342475891113281
= Running time: 4.347326755523682
= Running time: 4.350982427597046
= Running time: 4.370999574661255
Number of process: 5
= Running time: 4.369337797164917
= Running time: 4.391499757766724
= Running time: 4.43767237663269
= Running time: 6.300408124923706
= Running time: 6.31215763092041
Number of process: 6
= Running time: 4.366948366165161
= Running time: 4.38712739944458
= Running time: 6.366809844970703
= Running time: 6.370593786239624
= Running time: 6.422687530517578
= Running time: 6.433435916900635

简短回答:人口增长率低可能是操作系统造成的,但您尚未提供分析所需的数据

长答案:需要介绍操作系统

在你的帖子里,你声称

时间是在子进程内计算的,因此不包括开销

这是错误的。你计算经过的时间,也就是“挂钟时间”。任何操作系统开销都包括在这段时间内:垃圾收集、上下文交换等

要正确地评测您的系统,您需要评测您的系统,而不仅仅是一个应用程序。当这些进程执行时,您的系统上还运行着什么?因为这是Windows,所以实际上可以保证您的四个核心除了Python RTE(运行时环境)之外还有其他事情要做。要了解多进程应用程序中发生的情况,请使用动态探查器运行,并观察Python进程运行时哪些进程处于活动状态。按流程或作业绘制活动图;我希望您会看到几个系统服务也在工作


有关更简单、更不准确的进程活动度量,请查看如何从Windows中提取每个进程的CPU消耗。

当我谈论“开销”时“我指的是系统在多处理完成后生成子进程和关闭子进程的时间。我不认为垃圾收集和上下文交换与这种减速有任何关系,因为计时器是在子进程内启动和完成的。当然,我不相信CPU运行速度会随着进程的增加而变慢,我只是不知道CPU花费了多少额外的时间。我关心的时间是挂钟时间,因为这是我等待程序运行和完成的时间。我知道有很多后台进程和服务,所以我确保在后台没有大的作业,当我运行测试时,这些作业要求大的I/O或CPU时间,任务管理器显示约2%的CPU负载。我故意将最大进程设置为6,因此还有2个进程需要处理其他事务。尽管如此,壁面时间随着工艺数量的增加而稳定增加。6道工序的时间比1道工序高50%。如果这是由系统服务引起的,这意味着后台的CPU负载始终超过15-20%,显然不是这样。好吧,你考虑的是正确的事情。然而,没有硬数据张贴在这里,我们只是猜测。这使得它不适合堆栈溢出。