Python 3.6:为什么pickle.dumps(nparray)会永久增加引用计数?

时间:2019-01-19 16:07:30

标签: python numpy automatic-ref-counting

腌制后的np.ndarray会从转储函数中增加引用计数器,但是引用计数永远不会减少。

Python 3.6.4 Anaconda Ubuntu 16.04.5 LTS numpy 1.16.0

我已经尝试使用numpy.array.tolist()转换为列表,但是这种方法太慢了。

import numpy as np
import pickle
import sys

a = np.ndarray((10, 10), dtype=np.uint8)
print(sys.getrefcount(a)) # 2
pickle.dumps(a)
print(sys.getrefcount(a)) # 3

由于在pickler dumps函数中发生Py_DECREF,我希望输出为2、2,但是它仍然存在。

输出为2、3,我无法修复。我正在疯狂地泄漏记忆。

当前正在研究_pickle.c。

1 个答案:

答案 0 :(得分:0)

您遇到了this specific bug,并且仅在Numpy 1.16.0中是回归。为支持a new pickle protocol 5而添加的新代码在后备情况下泄漏了对绑定的__reduce__方法的引用。

您可以等待该bug修复并发布1.16.1,或者返回Numpy 1.15.4。