如何在Python中平行一个嵌套的循环



好吧,这是我的问题:我的程序中有一个嵌套循环,该循环在单个核心上运行。由于该程序在此嵌套循环中花费了超过99%的运行时间,因此我想并行化它。现在,我必须等9天才能完成计算。我尝试使用multiprocessing库来实现循环的并行。但是我只找到非常基本的例子,无法将它们转移到我的问题上。这是带有随机数据的嵌套环:

import numpy as np
dist_n = 100
nrm = np.linspace(1,10,dist_n)
data_Y = 11000
data_I = 90000
I = np.random.randn(data_I, 1000)
Y = np.random.randn(data_Y, 1000)
dist = np.zeros((data_I, dist_n)
for t in range(data_Y):
    for i in range(data_I):
        d = np.abs(I[i] - Y[t])
        for p in range(dist_n):
            dist[i,p] = np.sum(d**nrm[p])/nrm[p]
    print(dist)

请给我一些建议如何并行。

有一个小开销,启动一个过程(50ms 取决于数据大小(,因此通常最好将最大的代码块MP。从您的评论中,听起来t的每个循环都是独立的,因此我们应该自由地并行化。

当Python创建一个新的过程时,您将获得主过程的副本,因此您可以使用所有的全局数据,但是当每个过程都写入数据时,它将写入其自己的本地副本。这意味着dist[i,p]无法在主过程中可用,除非您将其明确地通过返回(将有一些开销(将其传递回去。在您的情况下,如果每个过程都将dist[i,p]写入文件,那么您应该没问题,除非您实现某种类型的Mutex访问控制,否则不要尝试写入同一文件。

#!/usr/bin/python
import time
import multiprocessing as mp
import numpy as np
data_Y = 11 #11000
data_I = 90 #90000
dist_n = 100
nrm = np.linspace(1,10,dist_n)
I = np.random.randn(data_I, 1000)
Y = np.random.randn(data_Y, 1000)
dist = np.zeros((data_I, dist_n))
def worker(t):
    st = time.time()
    for i in range(data_I):
        d = np.abs(I[i] - Y[t])
        for p in range(dist_n):
            dist[i,p] = np.sum(d**nrm[p])/nrm[p]
    # Here - each worker opens a different file and writes to it
    print 'Worker time %4.3f mS' % (1000.*(time.time()-st))

if 1:   # single threaded
    st = time.time()
    for x in map(worker, range(data_Y)):
        pass
    print 'Single-process total time is %4.3f seconds' % (time.time()-st)
    print
if 1:   # multi-threaded
    pool = mp.Pool(28) # try 2X num procs and inc/dec until cpu maxed
    st = time.time()
    for x in pool.imap_unordered(worker, range(data_Y)):
        pass
    print 'Multiprocess total time is %4.3f seconds' % (time.time()-st)
    print

如果您再次重新添加data_y/data_i的大小,速度应增加到理论上的限制。

相关内容

  • 没有找到相关文章

最新更新