Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么PyTypeObject有这么多特定功能的特定成员_Python_C_Interpreter_Cpython - Fatal编程技术网

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。