我在Cython工作,需要使用Python的int
类型,而不是C的int
类型。如何将Cython变量声明为Python样式的整数?
cdef int x
将使用C样式的整数,而不是Python样式的整数。
cdef object x
可以存储Python风格的整数,但由于冗余的运行时类型检查,它会很慢。
如果我100%知道一个对象将是int
,我可以避免运行时类型检查吗?
Cython文档似乎表明,将其声明为object
是我们能做的最好的事情,我们只需要忍受冗余。这感觉不像Cython,我也不完全相信我对文档的解释是正确的。
有可能按照我的要求去做吗?
文档非常清晰(添加了强调(:
Python类型
int
、long
和float
不可用于静态类型,而是分别解释为Cint
、long
和float
,作为使用这些Python类型的静态类型变量没有任何优势
有许多具体的C API与list
、tuple
等相关,其中静态类型提供了一个有意义的好处,允许Cython通过编译更具侵入性的代码来节省时间(例如,直接访问list
和tuple
的底层数组(。对于Python3的int
(和Python2的long
(,这种优势在很大程度上不存在;Cython最多可以跳过少量的类型检查工作,以换取在没有这些预检查的情况下复制操作中涉及的所有其他代码(Python 2的int
是一个隐藏的Clong
,所以您也可以直接声明它,并从直接使用原始C值中受益(。考虑到处理任意精度整数的复杂性,这是相当多的代码,完全没有必要。如果你的值足够小,你可以将它们用作C类型,但对于任何更大的值,专门化它们的成本都会大于收益。
简而言之:将其声明为nothing,或者如果您希望显式,则声明为object
。你试图做的事情没有任何好处,而且你无论如何都不能去做。