Python 为什么在酸洗numpy阵列时会有很大的开销?
假设我有一个简单的Python数组:Python 为什么在酸洗numpy阵列时会有很大的开销?,python,numpy,pickle,Python,Numpy,Pickle,假设我有一个简单的Python数组: >>> x = [1.0, 2.0, 3.0, 4.0] 腌制时,其尺寸相当小: >>> pickle.dumps(x).__len__() 44 如果我使用numpy数组,它的大小为什么会大得多 >>> xn = np.array(x) >>> pickle.dumps(xn).__len__() 187 将其转换为不太精确的数据类型只会有一点帮助 >>> x1
>>> x = [1.0, 2.0, 3.0, 4.0]
腌制时,其尺寸相当小:
>>> pickle.dumps(x).__len__()
44
如果我使用numpy数组,它的大小为什么会大得多
>>> xn = np.array(x)
>>> pickle.dumps(xn).__len__()
187
将其转换为不太精确的数据类型只会有一点帮助
>>> x16 = xn.astype('float16')
>>> pickle.dumps(x16).__len__()
163
其他numpy/scipy数据结构(如稀疏矩阵)也不能很好地处理。为什么?在调试器中检查,numpy数组除了数据之外还有max、min、type等字段,我不确定python列表是否有这些字段 有关完整列表,请访问
由于pickle只是一个二进制复制,这些其他字段也被复制,从而导致更大的大小。
pickle.load(pickle.dumps(sparse.coo_matrix(x))
对我来说效果很好。ndarray
的pickle
本质上是其np.save
的字符串版本。它有适度的开销缓冲区(200字节左右)加上一个主数据缓冲区的副本。开销有一些基本信息,如shape
和dtype
。数据缓冲区大小完全取决于元素的数量(和数据类型)。它基本上是x.nbytes
长的。