在Cython生成的C代码中优化掉PyFloat_FromDouble,Pyx_GetItemInt和PyObject_RichCompare

The*_*Cat 0 python types numpy cython

我试图在Cython中为Python编写一个运行长度编码算术库.下面你会看到声明和算法热循环的重要部分是如何看的.它有两个地方有很多和中等的Python交互,第73-74行和第77行.为重度Python交互部分生成的C代码最后显示在一张图片中.我只会询问如何在这里解决73-74,因为我认为77的修复程序是相似的.

正如您所看到的,在生成的C代码中有1)很多类型转换,2)它使用richcompare和3)getitemint.我不明白为什么:1)类型应该是相同的,2)比较应该可以在C级别,因为他们只是比较相同类型的数字和3)getitem应该是多余的,因为你只是查找一个C数组中的索引.

如何解决这个问题以优化我的代码?numpy数组声明创建Python对象的问题是否需要以某种方式指向它们?

在此输入图像描述

在这里,您可以看到为我的热循环中的两个黑暗和淡黄色位置生成的C代码Cython:

在此输入图像描述

Dav*_*idW 5

您尚未键入nvsnrs因此将它们视为Python对象(因此nv必须转换为Python对象进行比较).

做:

cdef long[:] nrs = np.zeros( # ... as before
cdef double[:] nvs = np.zeros( # ... as before
Run Code Online (Sandbox Code Playgroud)

(另外,虽然html的图像很有帮助,但如果你将代码也包含在文本中,它会更容易阅读...)

  • @TheUnfunCat我建议对函数的签名也使用`long [:: 1] nrs = ...`。这清楚表明内存是连续的,从而导致生成更有效的代码,请参见例如/sf/ask/3434126461/ (2认同)