为什么酸洗 numpy 数组的开销很大?

Why is there a large overhead in pickling numpy arrays?

假设我在 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

将其转换为不太精确的数据类型只会有一点帮助...

>>> x16 = xn.astype('float16')
>>> pickle.dumps(x16).__len__()
163

其他 numpy/scipy 稀疏矩阵等数据结构也不好腌制。为什么?

在调试器中检查它,一个 numpy 数组除了数据之外还有 max、min、type 等字段,我不确定 python 列表是否有。

可在 http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

上找到完整列表

由于 pickling 只是一个二进制复制,这些其他字段也被复制,导致更大的大小。