【问题标题】:Why is there a large overhead in pickling numpy arrays?为什么酸洗 numpy 数组的开销很大?
【发布时间】:2015-07-08 21:20:43
【问题描述】:

假设我在 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 数据结构(如稀疏矩阵)也不能很好地腌制。为什么?

【问题讨论】:

  • pickle.loads(pickle.dumps(sparse.coo_matrix(x))) 适合我。

标签: python numpy pickle


【解决方案1】:

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

完整列表可在http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html上找到

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

【讨论】:

  • picklendarray 本质上是其np.save 的字符串版本。它具有适度的开销缓冲区(200 字节左右)以及其主数据缓冲区的副本。开销包含基本信息,例如 shapedtype。数据缓冲区大小完全取决于元素的数量(和 dtype)。它本质上是x.nbytes long。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 2020-06-03
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多