定义以下函数,该函数将自然数添加到您要输入的位置。
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做的事情,我在此询问问题。
答案 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))