为什么';这个简单的python多处理脚本在两个内核之后是否能更好地并行化?

为什么';这个简单的python多处理脚本在两个内核之后是否能更好地并行化?,python,amazon-web-services,amazon-ec2,multiprocessing,Python,Amazon Web Services,Amazon Ec2,Multiprocessing,我正在尝试使用python的多处理模块在AWSEC2实例上并行化我的一些代码。然而,我没有得到我所期望的加速。因为我不确定问题出在哪里,所以我尝试运行下面这个简单的示例脚本 import multiprocessing import time def square(x): result = x**2 return result def par(): for num_cores in range(1,multiprocessing.cpu_count()+1):

我正在尝试使用python的多处理模块在AWSEC2实例上并行化我的一些代码。然而,我没有得到我所期望的加速。因为我不确定问题出在哪里,所以我尝试运行下面这个简单的示例脚本

import multiprocessing
import time

def square(x):
    result = x**2

    return result

def par():
    for num_cores in range(1,multiprocessing.cpu_count()+1):

        start = time.time()
        pool = multiprocessing.Pool(processes=num_cores)
        x = range(0,1000000)

        results = pool.map(square,x)
        pool.close()
        pool.join()
        stop = time.time()
        print num_cores,stop-start

if __name__=='__main__':
    par()
我在一个c4.8xlarge EC2实例(36个VCPU)上运行了这个程序,得到的输出从num_core=1提高到num_core=2,但在这一点之后几乎饱和。这与我在实际代码中看到的行为相同(更复杂)。我是否在脚本中做了一些不正确的事情(我一年前做的工作在EC2上也做得很好),或者EC2实例中是否有一些特定的东西会导致这种行为

输出如下所示:

1 4.54366803169
2 2.94242286682
3 2.8423769474
4 2.62595009804
5 2.57699894905
6 2.73259091377
7 2.59096288681
8 2.64281415939
9 2.63401508331
10 2.68470692635
11 3.24949598312
12 2.57163906097
13 2.72224593163
14 2.53613996506
15 2.50157499313
16 2.58340406418
17 2.50496888161
18 2.56644797325
19 2.59975194931
20 2.59667301178
21 2.7128059864
22 2.73017811775
23 2.59903597832
24 2.64776611328
25 2.62305593491
26 2.70264601707
27 2.66796994209
28 2.62165784836
29 2.73838996887
30 2.67824697495
31 2.67478704453
32 2.74541497231
33 2.72921586037
34 2.69398999214
35 2.77073812485
36 2.77028203011

考虑一个稍微贵一点的手术。这里的限制因素可能是发送和收集结果的线程。我同意@SeanMcSomething。另外,要小心机器可能正在执行的任何超线程。不确定它有多少个物理内核,但这应该是您所能达到的最高值。@SeanMcSomething,您可能是对的。我将平方函数改为“result=math.log(x)*x**2+3*x+math.log(2*x)”。在这样做时,我直到核心7或8才看到输出饱和。所以我的实际代码可能会出现类似的情况。这里的限制因素可能是发送和收集结果的线程。我同意@SeanMcSomething。另外,要小心机器可能正在执行的任何超线程。不确定它有多少个物理内核,但这应该是您所能达到的最高值。@SeanMcSomething,您可能是对的。我将平方函数改为“result=math.log(x)*x**2+3*x+math.log(2*x)”。在这样做时,我直到核心7或8才看到输出饱和。因此,我的实际代码可能也在发生类似的事情。