Python 由于多处理,程序加速

Python 由于多处理,程序加速,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,有一个例子,它应该执行以下数学运算: ((A-排序(B))*(A-排序(C))。 我想了解多线程或多处理是如何加速程序代码的 使用多线程(从线程导入线程)很可能不会给出结果,因为存在GIL。上次我尝试从多处理使用进程,但我没有获得任何速度增益,这就是我问这个问题的原因 在本例中,计划在不同的过程中计算part1和part2,但我不知道如何正确地实现它。我想获得一个示例,说明如何在过程或其他地方将其全部打包 顺便说一下,我认为您可以在不同的线程中创建列表,但为此,您需要编写一个函数来创建这些列表

有一个例子,它应该执行以下数学运算:

((A-排序(B))*(A-排序(C))。

我想了解多线程或多处理是如何加速程序代码的

使用多线程(
从线程导入线程
)很可能不会给出结果,因为存在GIL。上次我尝试从
多处理
使用
进程
,但我没有获得任何速度增益,这就是我问这个问题的原因

在本例中,计划在不同的过程中计算
part1
part2
,但我不知道如何正确地实现它。我想获得一个示例,说明如何在
过程
或其他地方将其全部打包

顺便说一下,我认为您可以在不同的线程中创建列表,但为此,您需要编写一个函数来创建这些列表

import random
from time import time

# e = ((A - SORT(B))*(А - SORT(C))

def difference(array1, array2):
    array3 = []
    for i in range(len(array1)):
        array3.append(array1[i] - array2[i])
    return array3

tic = time()
A = [random.randint(0,1000000) for i in range(1000000)]
B = [random.randint(0,1000000) for i in range(1000000)]
C = [random.randint(0,1000000) for i in range(1000000)]
toc = time()
print("Execution time of creating lists:", toc - tic)
# Execution time of creating lists: 6.700585842132568

tic = time()
part1 = difference(A, sorted(B))
part2 = difference(A, sorted(C))

result = [a * b for a, b in zip(part1, part2)]
toc = time()

print("Execution time of mathematical operations:", toc - tic)
# Execution time of mathematical operations: 2.102379560470581
我试图使用
多处理
中的
,我的代码如下所示:

from multiprocessing import Pool
...
...
...
pool = Pool(processes=2)
result1 = pool.apply_async(difference, [A, sorted(B)])
part1 = result1.get()

result2 = pool.apply_async(difference, [A, sorted(C)])
part2 = result2.get()

但是程序变慢了…

如果允许同时运行多个进程,而不是一个接一个地运行,
pool.apply\u async
启动一个进程,但
result.get
等待进程完成。通过
pool启动多个任务。apply\u async
在运行之前都在等着呢

将池(进程=2)作为池:
#启动这两项任务
result1=pool.apply\u async(差异[A,排序(B)])
result2=pool.apply\u async(差异[A,排序(C)])
#在两个任务都在运行后等待*
part1=result1.get()
part2=result2.get()

请注意,
多处理
在启动和管理进程以及在进程之间复制输入和输出方面有显著的开销。例如,只有两个进程(最大加速系数2)和大的输入/输出,将只实现很少的加速-我的机器上的加速因子1.15。< /P>让我们知道你为多进程所做的尝试。通过使用NUMPY,代码可以增加10倍。这是一个你会考虑或不考虑的解决方案吗?@ KLASTUS。补充说。“DavideFiocco Thanks,我知道。我想知道如何加快标准代码。使用Python的多线程/多处理
apply\u async
启动一个任务,然后
.get
等待该任务完成。您的代码一次只做一件事——您只需增加分支和等待分支合并的开销,但实际上只有一个分支做任何事情。