Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
PyVarObject的实际使用,cpython的可变长度子类型’;s PyObject_Python_C_Python C Api_Cpython_Pyobject - Fatal编程技术网

PyVarObject的实际使用,cpython的可变长度子类型’;s PyObject

PyVarObject的实际使用,cpython的可变长度子类型’;s PyObject,python,c,python-c-api,cpython,pyobject,Python,C,Python C Api,Cpython,Pyobject,作为一个最近一直在使用Python C-API的人,我对PyVarObject感到好奇,它是专门用于定义可变长度类型的PyObject的一个子类型,尽管有以下警告: 这种类型不经常出现在Python/CAPI中 …有大量的文档和其他API细节专门用于PyVarObject,我真的很好奇是否存在任何与Python API相关的问题(无论多么特殊),它可以显著简化解决方案。它主要用于不可变的容器类型(例如和)。其思想是,该类型的末尾可以有一个包含其所有数据的数组。当它被分配(使用PyObject\u

作为一个最近一直在使用Python C-API的人,我对
PyVarObject
感到好奇,它是专门用于定义可变长度类型的
PyObject
的一个子类型,尽管有以下警告:

这种类型不经常出现在Python/CAPI中


…有大量的文档和其他API细节专门用于
PyVarObject
,我真的很好奇是否存在任何与Python API相关的问题(无论多么特殊),它可以显著简化解决方案。

它主要用于不可变的容器类型(例如和)。其思想是,该类型的末尾可以有一个包含其所有数据的数组。当它被分配(使用
PyObject\u NewVar
或类似工具)时,会为它将包含的(不可变)数据分配额外的空间,这简化了内存管理,并且可能只需执行一次内存分配即可获得一点速度。由于大小在构造后不会改变,因此它可以使用此快捷方式,而不必担心通过重新分配内存而使对它的引用无效


稍微混淆事物也是一个
PyVarObject
,尽管它是可变的。但是,它有,因此在对象的末尾实际上没有分配额外的空间。相反,它存储一个指向
PyObject*
数组的指针,该数组单独分配(如果列表增长而不使对列表的引用无效,则可以重新分配)。大概是为了有一个
ob_size
字段而将其设置为
PyVarObject

您的问题不完全清楚或太宽泛。例如
list
。就我个人而言,我想我曾经使用过它。@tynn你是如何使用它的?啊哈,很有趣–那么你会说它更多的是CPython实现细节,而不是有用的
PyObject
子类型吗?介于两者之间。这当然是一个CPython实现细节。但它确实为某些容器类型提供了一点好处,因此,如果您要实现(不可调整大小的)numpy数组之类的东西,您可能会选择自己使用它。如果我理解正确的话,
PyVarObject*op
的存储是在对象指针指向的内存区域中
PyObject\u HEAD
之后的所有内容,例如
op+op->ob\u size
,是吗…这是OK哇,我个人觉得非常有趣,因为我目前正在做这样的事情-我正在写一个Python扩展在C++中取代PIL的简单图像I/O(由不可变的数组支持)。最好使用
PyVarObject
以Pythonic的方式实现hyperslab选择(作为数组索引或类似的东西)。整洁的是的,就是这样。分配的额外空间是
op->ob\u size
乘以
TypeObject
tp\u itemsize
字段。只需记住,分配后无法调整大小。太棒了。这对我来说很管用……我喜欢做分配,就像路易斯·汗(Louis Khan)做的那样,具体的、边界一致的、可怕的一成不变的分配。感谢@DavidW令人信服的细分–我没想到
PyVarObject
会有这么大的用处。