首次运行时的 Python 多处理开销

Posted

技术标签:

【中文标题】首次运行时的 Python 多处理开销【英文标题】:Python multiprocessing overhead when running for the first time 【发布时间】:2019-01-16 08:14:30 【问题描述】:

为什么第一次运行 Python 多处理池时开销要高得多? 与以下运行相比有什么不同?

import pandas as pd
import time 
import multiprocessing

def foo(n):
    for i in range(n):
        for j in range(n):
            for k in range(n):
                accum = i + j + k
    return(accum)

def test1(pool, n):
    pool.map(foo, [n, n])

def test2(n):    
    foo(n)
    foo(n)

if __name__ == "__main__":
    rtn = []
    pool = multiprocessing.Pool(processes=2)

    for n in range(100, 1100, 100):
        startTime = time.time()
        test1(pool, n)
        t1 = time.time() - startTime
        print('t1: 0 second'.format(time.time() - startTime))

        startTime = time.time()
        test2(n)
        t2 = time.time() - startTime
        print('t2: 0 second'.format(time.time() - startTime))

        rtn.append([n, t1, t2])

    xx = pd.DataFrame(rtn, columns=['n', 't1', 't2'])
    print(xx)

      n          t1          t2
0   100    3.843944    0.106006    <-------- t1 is much longer than t2
1   200    0.640689    1.000097
2   300    2.526334    4.140915
3   400    6.880183   11.183931
4   500   14.937281   25.981793
5   600   27.315186   39.802715
6   700   41.263902   60.289115
7   800   64.577426   95.624465
8   900   90.760957  132.725434
9  1000  120.575304  177.576586

【问题讨论】:

Find this SO post回答了这个问题。 ***.com/questions/1289813/… 【参考方案1】:

这是因为必须先创建池。所以python必须告诉操作系统创建子进程(在你的例子中是2)。一旦这些进程处于活动状态,python 就可以利用它们并处理您提交到池的任务。顺便说一句,完成后你应该close游泳池。

我喜欢三循环 cpu-stresser!希望我能解决你的问题!

【讨论】:

以上是关于首次运行时的 Python 多处理开销的主要内容,如果未能解决你的问题,请参考以下文章

使用TensorFlow-GPU + Python多处理时的错误?

Python 多处理返回结果,记录并在 Windows 上冻结运行

python_多线程多进程

多线程性能分析

Python 多处理 CPU 绑定并发,无需克隆 main

Python 多处理运行时错误