[英]python multiprocessing array
尽管所有看似相似的问题和答案,这里有:
我有一个相当大的2D numpy数组,并希望使用多处理逐行处理它。 对于每一行,我需要找到特定的(数值)值,并使用它们在第二个2D numpy数组中设置值。 一个小例子(真正用于appr.10000x10000单元格的数组):
import numpy as np
inarray = np.array([(1.5,2,3), (4,5.1,6), (2.7, 4.8, 4.3)])
outarray = np.array([(0.0,0.0,0.0), (0.0,0.0,0.0), (0.0,0.0,0.0)])
我现在想要使用多处理逐行处理inarray,以查找inarray中大于5的所有单元格(例如inarray [1,1]和inarray [1,2]),并在outarray中设置具有索引位置的单元格两个维度中较小的一个(例如,outarray [0,0]和outarray [0,1])到1。
如果您可以使用最新的numpy开发版本,那么您可以使用多线程而不是多处理。 由于这个PR在几个月前合并,numpy在索引时释放GIL,所以你可以做类似的事情:
import numpy as np
import threading
def target(in_, out):
out[in_ > .5] = 1
def multi_threaded(a, thread_count=3):
b = np.zeros_like(a)
chunk = len(a) // thread_count
threads = []
for j in xrange(thread_count):
sl_a = slice(1 + chunk*j,
a.shape[0] if j == thread_count-1 else 1 + chunk*(j+1),
None)
sl_b = slice(sl_a.start-1, sl_a.stop-1, None)
threads.append(threading.Thread(target=target, args=(a[sl_a, 1:],
b[sl_b, :-1])))
for t in threads:
t.start()
for t in threads:
t.join()
return b
现在做的事情如下:
In [32]: a = np.random.rand(100, 100000)
In [33]: %timeit multi_threaded(a, 1)
1 loops, best of 3: 121 ms per loop
In [34]: %timeit multi_threaded(a, 2)
10 loops, best of 3: 86.6 ms per loop
In [35]: %timeit multi_threaded(a, 3)
10 loops, best of 3: 79.4 ms per loop
我不认为多处理是正确的调用,因为您希望通过多个进程更改一个对象。 我认为这不是一个好主意。 我知道通过多个进程找到索引会很好,但是为了将数据发送到另一个进程,该对象在内部被pickle(再次:据我所知)。
请试试这个并告诉我们它是否很慢:
outarray[inarray[1:,1:] > 5] = 1
outarray
array([[ 1., 1., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.