如何在精确指定cpu的Python上执行并行计算否我要做任务i?

时间:2018-10-05 15:38:28

标签: python parallel-processing python-3.7

定义以下函数,该函数将自然数添加到您要输入的位置。

              A   B  C

01-01-2011   2   10  0
01-02-2011   0   12  2
01-03-2011   0   0   0
01-04-2011   3   11  3
01-05-2011   5   15  0
01-06-2011   0   23  1
01-07-2011   4   21  4
01-08-2011   2   0   5
01-09-2011   1   11  0

为了使用multiprocessing.dummy进行并行处理,我编写了以下内容

def f(x):
    lo=0
    for i in range(x):
            lo+=i
    return(lo)

它可以工作,但我认为计算时间不会减少。因为定义了以下报告计算时间的函数。

from multiprocessing.dummy import Pool as ThreadPool
pool=ThreadPool(4)
def f_parallel(x1,x2,x3,x4):
    listo_parallel=[x1,x2,x3,x4]
    resulto_parallel=pool.map(f,listo_parallel)
    return(resulto_parallel)

现在让我们检查一下。对于x = 10 ** 7、9 ** 7、10 ** 7-2、10 ** 6,正常f花费0.53、0.24、0.53、0.04秒。对于其中四个,f_parallel需要1.39秒!我希望看到0.53秒,因为我使用的计算机具有4 cpus,并且我在池中选择了4。但是为什么会这样呢?

我也尝试阅读Python 3.7的多处理库的文档,但是只有当我以正确的方式键入示例时,它们才起作用。例如,考虑该文档中的第一个示例。如果我输入

import time
def f_t(x):
    st=time.time()
    lob=f(x)
    st=time.time()-st
    return(lob,st)
def f_parallel_t(x1,x2,x3,x4):
    listo_parallel=[x1,x2,x3,x4]
    st=time.time()
    resulto_parallel=pool.map(f,listo_parallel)
    st=time.time()-st
    return(resulto_parallel,st)

然后什么也没有发生,我必须重新启动Shell(Ctrl + F6)。

做这个pool.map并不是我真正想要的,我想告诉Python完全在cpu no上执行f(x_i)。一世。因此,我想知道在编程的任何步骤上,要在哪个CPU上完成计算的哪一部分。

任何帮助或指导将不胜感激。


对于某人没有得到我真正想要用python做的情况,我正在从我现在制作的Maple文件中上传屏幕截图,这正是我要使用Python做的事情,我在此询问问题。

enter image description here

2 个答案:

答案 0 :(得分:2)

在CPython中,或多或少是“标准”实现的,一次只能有一个一个线程可以执行Python字节码。 因此,使用线程来加快计算速度在CPython中不起作用。

您可以改用multiprocessing.Pool。通常,我建议使用Pool的imap_unordered方法,而不要使用普通的map。前者将在值可用后立即开始产生值,而后者在所有计算完成后返回一个列表。

进入问题的核心,Python没有独立于平台的方法来指定要在哪个CPU上运行的进程。如您在链接页面上所见,所谓的processor affinity的工作方式在很大程度上取决于操作系统。当然,您可以使用subprocess运行上述实用程序之一,也可以使用ctypes直接执行相关的系统调用。

答案 1 :(得分:0)

感谢@FlyingTeller和@quamrana回答了我的other question,现在我知道如何实现python程序来并行执行四个计算,从而花费的时间与四个单独的最大时间相同计算。这是更正的代码:

def f(x):
    lo=0
    for i in range(x):
            lo+=i
    return(lo)
from multiprocessing import Pool
def f_parallel(x1,x2,x3,x4):
    with Pool(processes=4) as pool:
        resulto_parallel=pool.map(f,[x1,x2,x3,x4])
    return(resulto_parallel)
import time
def f_parallel_t(x1,x2,x3,x4):
    st=time.time()
    ans=f_parallel(x1,x2,x3,x4)
    st=time.time()-st
    return(ans,st)
if __name__ == '__main__':
    print(f_parallel_t(10**7,10**6,10**7-2,9**7))

以及运行结果时的屏幕截图: enter image description here