繁体   English   中英

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

[英]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 , and float are not available for static typing and instead interpreted as C int , long , and float respectively, as statically typing variables with these Python types has zero advantages.

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

简而言之:将其声明为无,或者如果您想明确说明,则声明为object 您尝试做的事情没有任何好处,而且无论如何您都无法做到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM