我正在尝试在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:
答案 0 :(得分:5)
您尚未键入nvs
或nrs
,因此他们被视为Python对象(因此nv
必须转换为Python对象才能进行比较)
执行:
cdef long[:] nrs = np.zeros( # ... as before
cdef double[:] nvs = np.zeros( # ... as before
(另外,虽然html的图片很有帮助,但如果您将代码也包含在文本中,则会更容易阅读...)