对于Python C Extensions,使用Py_DECREF而不是Py_XDECREF有什么好处?

时间:2017-01-28 21:59:14

标签: python python-c-api python-c-extension

我正在使用Python C扩展文档来定义新类型,并刚刚完成了Providing finer control over data attributes部分。

在本节中,他们更改了示例代码,以确保first结构的lastNoddy属性永远不会是NULL,例如通过初始化如果用户试图删除或以其他方式将这些属性设置为Null,则在new中清空字符串并添加引发TypeError的getter和setter。

此外(以及我的问题),作者将这些属性的所有Py_XDECREF更改为Py_DECREF,并说明:

  

通过这些更改,我们可以确保第一个和最后一个成员永远不会为NULL,因此我们几乎可以在所有情况下删除对NULL值的检查。这意味着大多数Py_XDECREF()调用都可以转换为Py_DECREF()调用。我们无法更改这些调用的唯一地方是在deallocator中,这些成员的初始化可能在构造函数中失败。

在我看来,使用Py_XDECREF会更安全,因为如果Py_DECREF传递segmentation fault值,NULL会产生Py_DECREF

使用Py_XDECREF而非function sum() { var w = document.getElementById('num1').value || 0; var x = document.getElementById('num2').value || 0; var y = document.getElementById('num3').value || 0; var z=parseInt(w)+parseInt(x)+parseInt(y); document.getElementById('final').value=z; }; 有什么好处?

1 个答案:

答案 0 :(得分:6)

如果您知道该对象不能为NULL,则Py_DECREF优于Py_XDECREF的好处是:

  • 它更快,因为它避免了不必要的测试和跳跃;
  • 另外,它提供了有效的零成本断言,指针非NULL - 如果不变量被破坏,程序将立即崩溃。

在处理低级代码时,这两点都很重要,这就是为什么Python核心和大多数扩展在指针实际上可以为NULL时只小心使用Py_XDECREF(或Py_CLEAR)的原因。