gpt4 book ai didi

python - 使用 tp_iternext 或 PyIter_Next 进行差异迭代

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

如果我编写一个使用可迭代对象执行某些操作的 C 函数,那么我首先创建一个迭代器,然后对其进行循环。

iterator = PyObject_GetIter(sequence);
if (iterator == NULL) {
return NULL;
}
while (( item = PyIter_Next(iterator) )) {
...
}

这工作正常,但我也看到了一些使用 tp_iternext 的函数:

iterator = PyObject_GetIter(sequence); // ....

iternext = *Py_TYPE(iterator)->tp_iternext;
while (( item = iternext(iterator) )) {
...
}

第二种方法似乎更快(我只有一个数据点:我的 Windows 计算机和我的 msvc 编译器)。

iternext 方法更快,这只是巧合吗?这两者之间有什么显着差异吗?

两者的 python 文档链接: PyIter_Next , tp_iternext我已经阅读过它们,但对我来说并不清楚何时以及为什么应该首选它们。

最佳答案

source code for PyIter_Next显示它只是检索 tp_iternext 槽并调用它并清除可能发生也可能未发生的 StopIteration 异常

如果您显式使用tp_iternext,则在耗尽迭代器时必须检查此StopIteration

<小时/>

顺便说一句:tp_iternext 的文档还说:

iternextfunc PyTypeObject.tp_iternext

An optional pointer to a function that returns the next item in an iterator. When the iterator is exhausted, it must return NULL; a StopIteration exception may or may not be set. When another error occurs, it must return NULL too. Its presence signals that the instances of this type are iterators.

虽然PyIter_Next的文档中没有这样的提及。

因此,PyIter_Next 是迭代迭代器的简单且安全方式。您可以使用 tp_iternext 但必须小心,不要在最后触发 StopIteration 异常。

关于python - 使用 tp_iternext 或 PyIter_Next 进行差异迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39768793/

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