首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python上进行并行计算,精确地指定cpu,而不是我做任务i?

如何在Python上进行并行计算,精确地指定cpu,而不是我做任务i?
EN

Stack Overflow用户
提问于 2018-10-05 15:38:27
回答 2查看 231关注 0票数 0

定义以下函数,该函数添加自然数,直到您要求的位置为止。

代码语言:javascript
运行
复制
def f(x):
    lo=0
    for i in range(x):
            lo+=i
    return(lo)

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

代码语言:javascript
运行
复制
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)

这是可行的,但我没有看到任何时间的计算。因为定义了以下函数,它也报告了计算时间。

代码语言:javascript
运行
复制
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)

现在让我们检查一下。对于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个cpus。但为什么会这样?

我还试图阅读Python3.7的多处理库的文档,但它们只有在我键入示例时才能工作。例如,考虑该文档中的第一个示例。如果我打字

代码语言:javascript
运行
复制
from multiprocessing import Pool
Pool(4).map(f,[10**7,9**7,10**7-2,10**6])

然后什么都没有发生,我不得不重新启动shell (Ctrl+F6)。

而做这个pool.map并不是我想要的,我想告诉Python在cpu上做f(x_i)。因此,我想知道在编程的任何一步,我的计算的哪一部分是在哪个cpu上进行的。

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

如果有人不知道我真正想用python做什么,我会上传我现在创建的Maple文件的屏幕截图,这正是我想用Python做的,我在问这个问题。

EN

回答 2

Stack Overflow用户

发布于 2018-10-06 19:46:40

在CPython中,或多或少是“标准”实现,一次只能执行一个线程。因此,在CPython中使用线程来加速计算是行不通的。

你可以用multiprocessing.Pool代替。通常,我建议使用Pool的imap_unordered方法,而不是普通的map。前者一旦可用,就会产生值,而后者则会在完成所有计算之后返回一个列表。

谈到问题的核心,Python没有一个独立于平台的方法来指定它将在哪个CPU上启动进程。所谓的处理器亲和力如何工作是非常依赖操作系统的,你可以在链接的页面上看到。当然,您可以使用subprocess运行上述实用程序之一,也可以使用ctypes直接执行相关的系统调用。

票数 3
EN

Stack Overflow用户

发布于 2018-10-08 09:04:00

感谢回答了我的其他问题的@FlyingTeller和@quamrana,现在我知道了如何实现python程序来并行四个计算,这样就可以达到四个单独计算的最大时间。以下是修正后的代码:

代码语言:javascript
运行
复制
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))

当我运行时,结果的截图是:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52669113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档