[英]How to efficiently use Python-style integers in Cython?
我在 Cython 工作,我需要使用 Python 的int
类型,而不是 C 的int
类型。 如何将 Cython 变量声明为 Python 风格的 integer?
cdef int x
将使用 C 风格的 integer,而不是 Python 风格的 integer。
cdef object x
可以存储 Python 风格的 integer,但由于冗余的运行时类型检查,它会很慢。
如果我 100% 知道 object 将是一个int
,我可以避免运行时类型检查吗?
Cython 文档似乎表明将其声明为object
是我们能做的最好的事情,我们只需要忍受冗余。 这感觉与 Cython 不同,我不完全相信我正确解释了文档。
甚至可以按照我的要求做吗?
文档很清楚(强调):
The Python types
int
,long
, andfloat
are not available for static typing and instead interpreted as Cint
,long
, andfloat
respectively, as statically typing variables with these Python types has zero advantages.
有许多具体的 C API 与诸如list
、 tuple
等内容相关联,其中 static 类型提供了一个有意义的好处,允许 Cython 通过在更具侵入性的级别上编译与它们一起工作的代码来节省时间(直接访问底层数组例如list
和tuple
)。 对于 Python 3 的int
(和 Python 2 的long
),这种优势在很大程度上不存在; 充其量,Cython 可以跳过少量的类型检查工作,以换取在没有这些预检查的情况下重现操作中涉及的所有代码的 rest(Python 2 的int
是 C long
,所以你也可以如此声明并受益于直接使用原始 C 值)。 考虑到使用任意精度整数的复杂性,这是相当多的代码,而且完全没有必要。 如果您的值足够小,您可以将它们用作 C 类型,但对于任何更大的值,专门针对它们的成本将大于收益。
简而言之:将其声明为无,或者如果您想明确说明,则声明为object
。 您尝试做的事情没有任何好处,而且无论如何您都无法做到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.