Python 为什么PyTypeObject有这么多特定功能的特定成员
例如,Python 为什么PyTypeObject有这么多特定功能的特定成员,python,c,interpreter,cpython,Python,C,Interpreter,Cpython,例如,PyFloat\u Type在tp\u as\u number中有许多操作。当初始化此类型对象时,所有这些操作都将写入带有插槽的对象的tp_dict 另一方面,当我编写一个包含\uuu add\uu的自定义类时,它的tp\u dict将包含\uu add\uu。初始化类型对象时,此\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu函数将作为带插槽的类型对象的编号写入tp\u 我想tpu dict已经记录了我们需要的所有信息。为什么我们需要其
PyFloat\u Type
在tp\u as\u number
中有许多操作。当初始化此类型对象时,所有这些操作都将写入带有插槽的对象的tp_dict
另一方面,当我编写一个包含\uuu add\uu
的自定义类时,它的tp\u dict
将包含\uu add\uu
。初始化类型对象时,此\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数将作为带插槽的类型对象的编号写入tp\u
我想tpu dict
已经记录了我们需要的所有信息。为什么我们需要其他成员,例如tp\u as\u number
?这只是一个历史问题吗?因为当一个C级函数使用您的类型时,它不是在tp\u dict
(慢速)中按名称执行查找,而是直接从tp\u as\u number
(快速)中拉出指针
一对指针解引用是一个微不足道的开销,不需要引用计数样板文件等。;大多数情况下,成本是以单个数字周期来衡量的,其中dict
查找的成本要高出几个数量级左右
通常的情况实际上是tp_as_number
,知道它与tp_dict
中的等效条目同步;如果简单的添加需要一个dict
查找,CPython将比现在慢得多。非常感谢。因此,使用tp_as_number是因为查找速度,而使用tp_dict是因为有时我们需要做一些事情,比如super(MyFloat,self)。\uuu add(other)。是吗?@delphifirst:是的。或者出于其他目的参考\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。