PyInt_FromLong和Py_BuildValue之间的区别

时间:2013-07-14 01:36:47

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

Python / C API有许多相关的函数,它们执行类似的操作,其中一个通常用于一般用途,另一个在某种程度上对特定情况更有效或更方便。

例如,PyDict_SetItemPyDict_SetItemString相同,但后者专门用于将C字符串作为键。对于PyList_SetItemPyList_SET_ITEM,第二个没有错误检查,也没有减少现有项目explained here)。

但是,如果总是PyInt_FromLong,有什么原因可以让Py_BuildValue进行特殊转化?两者都返回对Python对象的新引用,并且似乎完全相同。同样的问题也适用于PyInt_FromSsize_tPyTuple_Pack等功能(当然,所有功能都与Py_BuildValue进行了比较)。

什么时候应该使用另一个?

1 个答案:

答案 0 :(得分:4)

对我来说,这是性能和简单性之间的权衡。对于我编写的代码,我倾向于使用Py_BuildValue而不关心运行时间(即返回一组不会改变的值,或者运行时间太长,额外的开销无关紧要。)对于性能关键函数,特别是那些可以位于循环最内层的函数,我将使用尽可能使用最低级别的API调用。

是否值得这是一个不同的问题。我永远不会收回我花在试图获得最佳性能的时间,但我知道使用我的代码的其他应用程序的速度要快得多。