如何在Cython中有效地使用Python风格的整数



我在Cython工作,需要使用Python的int类型,而不是C的int类型。如何将Cython变量声明为Python样式的整数?

cdef int x将使用C样式的整数,而不是Python样式的整数。

cdef object x可以存储Python风格的整数,但由于冗余的运行时类型检查,它会很慢。

如果我100%知道一个对象将是int,我可以避免运行时类型检查吗?

Cython文档似乎表明,将其声明为object是我们能做的最好的事情,我们只需要忍受冗余。这感觉不像Cython,我也不完全相信我对文档的解释是正确的。

有可能按照我的要求去做吗?

文档非常清晰(添加了强调(:

Python类型intlongfloat不可用于静态类型,而是分别解释为Cintlongfloat作为使用这些Python类型的静态类型变量没有任何优势

有许多具体的C API与listtuple等相关,其中静态类型提供了一个有意义的好处,允许Cython通过编译更具侵入性的代码来节省时间(例如,直接访问listtuple的底层数组(。对于Python3的int(和Python2的long(,这种优势在很大程度上不存在;Cython最多可以跳过少量的类型检查工作,以换取在没有这些预检查的情况下复制操作中涉及的所有其他代码(Python 2的int是一个隐藏的Clong,所以您也可以直接声明它,并从直接使用原始C值中受益(。考虑到处理任意精度整数的复杂性,这是相当多的代码,完全没有必要。如果你的值足够小,你可以将它们用作C类型,但对于任何更大的值,专门化它们的成本都会大于收益。

简而言之:将其声明为nothing,或者如果您希望显式,则声明为object。你试图做的事情没有任何好处,而且你无论如何都不能去做。

相关内容

  • 没有找到相关文章

最新更新