Python / C API有许多相关的函数,它们执行类似的操作,其中一个通常用于一般用途,另一个在某种程度上对特定情况更有效或更方便。
例如,PyDict_SetItem
和PyDict_SetItemString
相同,但后者专门用于将C字符串作为键。对于PyList_SetItem
和PyList_SET_ITEM
,第二个没有错误检查,也没有减少现有项目explained here)。
但是,如果总是PyInt_FromLong
,有什么原因可以让Py_BuildValue
进行特殊转化?两者都返回对Python对象的新引用,并且似乎完全相同。同样的问题也适用于PyInt_FromSsize_t
,PyTuple_Pack
等功能(当然,所有功能都与Py_BuildValue
进行了比较)。
什么时候应该使用另一个?
答案 0 :(得分:4)
对我来说,这是性能和简单性之间的权衡。对于我编写的代码,我倾向于使用Py_BuildValue而不关心运行时间(即返回一组不会改变的值,或者运行时间太长,额外的开销无关紧要。)对于性能关键函数,特别是那些可以位于循环最内层的函数,我将使用尽可能使用最低级别的API调用。
是否值得这是一个不同的问题。我永远不会收回我花在试图获得最佳性能的时间,但我知道使用我的代码的其他应用程序的速度要快得多。