Python3如何知道如何pickle扩展类型,尤其是Numpy数组?
Numpy数组作为扩展类型(即使用C API中的扩展定义的数组),声明Python解释器范围之外的其他字段(例如,Python3如何知道如何pickle扩展类型,尤其是Numpy数组?,python,python-3.x,numpy,pickle,python-c-api,Python,Python 3.x,Numpy,Pickle,Python C Api,Numpy数组作为扩展类型(即使用C API中的扩展定义的数组),声明Python解释器范围之外的其他字段(例如,数据属性,它是一种缓冲区结构,如Numpy中所述。 为了能够对其进行序列化,Python 2使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu函数作为pickle协议的一部分,如中所述,并进行了说明 但是,即使Python 3中仍然存在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
数据
属性,它是一种缓冲区结构
,如Numpy中所述。为了能够对其进行序列化,Python 2使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数作为pickle协议的一部分,如中所述,并进行了说明
但是,即使Python 3中仍然存在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
此外,还有其他与酸洗扩展类型相关的条目:
- ,被描述为扩展类型的Pickle接口构造函数注册,但是在copyreg模块本身中没有提到扩展类型
- 它为Python3发布了一个新的缓冲协议(并且可能会自动为这个缓冲协议进行酸洗)
- 新样式类:可以假设新样式类对酸洗过程有影响
那么,所有这些与Numpy阵列的关系如何:
Numpy数组是否实现了特殊的方法,例如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
Numpy是否使用了Python的C-API结构,这些结构是Pickle开箱即用支持的(比如新的缓冲协议
),所以Pickle Numpy数组不需要任何补充
Python3pickle
尽管如此,它还是包含在下面
Numpy的支持在这方面没有改变;它在数组上实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
以支持Python 2或3中的pickle:
>>> import numpy
>>> numpy.array(0).__reduce__()
(<built-in function _reconstruct>, (<class 'numpy.ndarray'>, (0,), b'b'), (1, (), dtype('int64'), False, b'\x00\x00\x00\x00\x00\x00\x00\x00'))
导入numpy
>>>numpy.array(0)。\uuuu reduce\uuu()
(,(,(0,),b'b'),(1,(),数据类型('int64'),False,b'\x00\x00\x00\x00\x00\x00\x00'))
返回一个三元素元组,由一个用于重新创建值的函数对象、一个用于该函数的参数元组和一个用于传递no
newinstance的状态元组组成
\uuuuuuuuuuuuuuuuuuuuuuuuu
在Python3中仍然存在……问题是reduce
文档中对扩展类型的提及已经被删除,即使reduce
仍然存在。但正如公认的答案(以及下面的注释)所述,这仍然是真的。那么中所说的仍然是真的吗?为什么他们要将\uuu reduce\uuuu
文档从扩展类型
移动到更一般的类实例
部分?@Phylliade:是的,一切仍然是真的。该方法不是扩展类型独有的(而且自定义Python类和扩展类型之间的界限在很大程度上已经模糊了)。@Phylliade:\uuuuu reduce\uuuu
是较低级别的复制协议实现;自定义Python类应该实现更高级别的方法(\uuuuu getnewargs\u ex\uuuuu
/\uu getstate\uuuuu
/\uu setstate\uuu
)如果可能,一个默认的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
实现将使用这些。