定义以下函数,该函数添加自然数,直到您要求的位置为止。
def f(x):
lo=0
for i in range(x):
lo+=i
return(lo)
为了使用multiprocessing.dummy进行并行处理,我编写了以下内容
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)
这是可行的,但我没有看到任何时间的计算。因为定义了以下函数,它也报告了计算时间。
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的多处理库的文档,但它们只有在我键入示例时才能工作。例如,考虑该文档中的第一个示例。如果我打字
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做的,我在问这个问题。
发布于 2018-10-06 19:46:40
在CPython中,或多或少是“标准”实现,一次只能执行一个线程。因此,在CPython中使用线程来加速计算是行不通的。
你可以用multiprocessing.Pool
代替。通常,我建议使用Pool的imap_unordered
方法,而不是普通的map
。前者一旦可用,就会产生值,而后者则会在完成所有计算之后返回一个列表。
谈到问题的核心,Python没有一个独立于平台的方法来指定它将在哪个CPU上启动进程。所谓的处理器亲和力如何工作是非常依赖操作系统的,你可以在链接的页面上看到。当然,您可以使用subprocess
运行上述实用程序之一,也可以使用ctypes
直接执行相关的系统调用。
发布于 2018-10-08 09:04:00
感谢回答了我的其他问题的@FlyingTeller和@quamrana,现在我知道了如何实现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))
当我运行时,结果的截图是:
https://stackoverflow.com/questions/52669113
复制相似问题