Python 3.6: 为什么pickle.dumps(nparray) 会永久增加refcount?

Python 3.6: Why does pickle.dumps(nparray) permanently increase refcount?

np.ndarray,当 pickle 时,从转储函数中增加引用计数器,但是引用计数永远不会减少。

Python 3.6.4 蟒蛇 Ubuntu 16.04.5 LTS 麻木 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。

您 运行 到 this specific bug, and it's a regression in Numpy 1.16.0 only. New code to add support for a new pickle protocol 5 泄漏了对回退案例中绑定 __reduce__ 方法的引用。

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