strided numpy array 是否在多个进程之间共享?
Is strided numpy array shared across multiple processes?
让我们假设我们创建了一个 numpy 数组,并使用跨步技巧在另一个数组上查看:
import numpy as np
from numpy.lib import stride_tricks
x = np.arange(20).reshape([4, 5])
arr = stride_tricks.as_strided(x, shape=(3, 2, 5),strides=(20, 20, 4))
我们可以确认这个新数组确实是一个视图:
assert not arr.flags['OWNDATA']
# True
问题:
如果我将 arr
作为参数传递给 multiprocessing.Process()
,arr
是否会被复制到每个进程中? x
会被复制吗?请解释原因。
如果共享是通过 pickle
序列化,那么显然 view
(如何生成)将产生一个副本:
In [298]: x = np.arange(10)
In [299]: y = x.reshape(2,5)
In [300]: import pickle
In [301]: B = pickle.dumps(y)
In [302]: Y = pickle.loads(B)
In [303]: Y
Out[303]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [304]: y.__array_interface__['data']
Out[304]: (43176224, False)
In [305]: x.__array_interface__['data']
Out[305]: (43176224, False)
In [306]: Y.__array_interface__['data']
Out[306]: (59035584, False)
numpy 数组的 pickle
实际上是由 np.save
执行的。
通过x
并在每个进程中制作视图可能会更好。
让我们假设我们创建了一个 numpy 数组,并使用跨步技巧在另一个数组上查看:
import numpy as np
from numpy.lib import stride_tricks
x = np.arange(20).reshape([4, 5])
arr = stride_tricks.as_strided(x, shape=(3, 2, 5),strides=(20, 20, 4))
我们可以确认这个新数组确实是一个视图:
assert not arr.flags['OWNDATA']
# True
问题:
如果我将 arr
作为参数传递给 multiprocessing.Process()
,arr
是否会被复制到每个进程中? x
会被复制吗?请解释原因。
如果共享是通过 pickle
序列化,那么显然 view
(如何生成)将产生一个副本:
In [298]: x = np.arange(10)
In [299]: y = x.reshape(2,5)
In [300]: import pickle
In [301]: B = pickle.dumps(y)
In [302]: Y = pickle.loads(B)
In [303]: Y
Out[303]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [304]: y.__array_interface__['data']
Out[304]: (43176224, False)
In [305]: x.__array_interface__['data']
Out[305]: (43176224, False)
In [306]: Y.__array_interface__['data']
Out[306]: (59035584, False)
numpy 数组的 pickle
实际上是由 np.save
执行的。
通过x
并在每个进程中制作视图可能会更好。