[英]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)
值得一提的是pickle
數組實際上是由np.save
執行的。
傳遞x
並在每個進程中創建視圖可能會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.