gpt4 book ai didi

python - Python 3 如何知道如何 pickle 扩展类型,尤其是 Numpy 数组?

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:15 25 4
gpt4 key购买 nike

Numpy 数组,作为扩展类型(又名在扩展中使用 C API 定义),在 Python 解释器的范围之外声明额外的字段(例如 data 属性,它是一个 缓冲区结构,如 Numpy 的 array interface 中所述。
为了能够对其进行序列化,Python 2 曾经使用 __reduce__ 函数作为 pickle 协议(protocol)的一部分,如 doc 中所述。 ,并解释了here .

但是,即使 __reduce__ 仍然存在于 Python 3 中,Pickle 协议(protocol) 部分(以及更不用说的 Pickling 和 unpickling 扩展类型)是从文档中删除,所以不清楚什么是什么。
此外,还有与 pickle 扩展类型相关的其他条目:

  • copyreg ,描述为 扩展类型的 Pickle 接口(interface)构造函数注册,但在 copyreg 模块本身中没有提及扩展类型。
  • PEP 3118 -- Revising the buffer protocol它为 Python 3 发布了一个新的缓冲协议(protocol)。(并且可能会自动对该缓冲协议(protocol)进行 pickle )。
  • 新型类:可以假设新型类对 pickle 过程有影响。

那么,所有这些与 Numpy 数组有什么关系:

  1. Numpy 数组是否实现特殊方法,例如 __reduce__ 来通知 Python 如何 pickle 它们(或 copyreg)? Numpy 对象仍然公开一个 __reduce__ 方法,但这可能是出于兼容性原因。
  2. Numpy 是否使用 Pickle 开箱即用支持的 Python C-API 结构(如新的 buffer protocol),因此不需要任何补充来 pickle numpy 数组?

最佳答案

Python 3 pickle 仍然 supports __reduce__ , 它包含在 Pickling Class Instances section 中.

Numpy 的支持在这方面没有改变;它在数组上实现了 __reduce__ 以支持 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'))

返回一个三元素元组,包括一个用于重新创建值的函数对象、一个该函数的参数元组和一个不传递 newinstance.__setstate__() 的状态元组。

关于python - Python 3 如何知道如何 pickle 扩展类型,尤其是 Numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45391834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com