我使用了 2 个工作线程池来分割 Python 函数中的总和,但时间并没有显示出任何加速,有什么特别的东西我错过了吗?

问题描述 投票:0回答:1

下面提供了Python代码文件。我在 Linux mint 21.3 上使用 Python 3.10.12(以防需要这些信息)。拥有 2 名工作人员的池比没有任何多重处理的池需要更多时间。我在这里做错了什么?

import multiprocessing
import time
import random

def fun1( x ):
    y = 0
    for i in range( len( x ) ):
        y = y + x[i]
    return( y )

def fun2( x ):
    p = multiprocessing.Pool( 2 )
    y1, y2 = p.map( fun1, [ x[ : len( x ) // 2 ], x[ len( x ) // 2 : ] ] )
    y = y1 + y2
    return( y )

x = [ random.random() for i in range( 10 ** 6 ) ]

st = time.time()
ans = fun1( x )
et = time.time()
print( f"time = {et - st}, answer = {ans}." )

st = time.time()
ans = fun2( x )
et = time.time()
print( f"time = {et - st}, answer = {ans}." )

x = [ random.random() for i in range( 10 ** 7 ) ]

st = time.time()
ans = fun1( x )
et = time.time()
print( f"time = {et - st}, answer = {ans}." )

st = time.time()
ans = fun2( x )
et = time.time()
print( f"time = {et - st}, answer = {ans}." )

这是我在终端中得到的内容。

time = 0.043381452560424805, answer = 499936.40420325665.
time = 0.1324300765991211, answer = 499936.40420325927.
time = 0.4444568157196045, answer = 5000677.883536603.
time = 0.8388040065765381, answer = 5000677.883536343.

我还在

if __name__ == '__main__':
之后和其余部分之前使用了
fun2
行,我在终端上得到了相同的结果。我还在 Codio 服务器上尝试了 Python 3.6.2。我也有类似的时间。

time = 0.048882484436035156, answer = 499937.07655266096.
time = 0.15220355987548828, answer = 499937.0765526707.
time = 0.4848289489746094, answer = 4999759.127770024.
time = 1.4035391807556152, answer = 4999759.127769606.

我猜我在代码中所做的事情有问题,是对如何使用

multiprocessing.Pool
而不是Python的误解,但想不出是什么。任何帮助将不胜感激。我预计使用两名工作人员可以将速度提高两倍,而不是降低速度。另外,如果需要的话,我检查了
multiprocessing.cpu_count()
,Codio服务器有4个,我的电脑有12个cpu。

python python-3.x parallel-processing multiprocessing python-multiprocessing
1个回答
0
投票

您正在复制相当大量的数据(> 90MB),因此 fun2 消耗大量时间进行数据复制(序列化/反序列化、进程间通信)。

>>> import pickle
>>> import random
>>> data = [random.random() for i in range(10 ** 7)]
>>> len(pickle.dumps(data))
90032371

您可以将数据存储在多个文件中,并将文件名分发给工作人员,而不是直接传递大数据。

您可能需要使用并行计算框架(例如 Polars、Dask 和 Ray),具体取决于您的工作负载。

© www.soinside.com 2019 - 2024. All rights reserved.