如何在Cython中高效地使用Python-style整数?

3
我正在使用Cython编程,需要使用Python的int类型,而不是C的int类型。如何声明一个Cython变量为Python风格的整数? cdef int x将使用C风格的整数,而不是Python风格的整数。 cdef object x可以存储Python风格的整数,但由于冗余的运行时类型检查,速度较慢。
如果我知道100%的对象将是一个int,我能避免运行时类型检查吗? Cython文档似乎表明将其声明为object是我们所能做的最好的办法,我们只需接受冗余。这感觉不太像Cython,并且我还没有完全确信我是否正确地解释了文档。
我所要求的事情甚至有可能实现吗?
1个回答

2
这段文本的意思是:“文档非常清晰(重点标出):Python 类型 int、long 和 float 不可用于静态类型,而是解释为 C 中的 int、long 和 float。因为使用这些 Python 类型进行静态类型变量声明没有任何优势。”

有许多具体的C API与像listtuple等相关的东西相关联,其中静态类型提供了有意义的好处,允许Cython通过更深入地编译与它们一起工作的代码(例如直接访问listtuple的基础数组)。对于Python 3的int(以及Python 2的long),这种优势在很大程度上不存在;最多,Cython可以跳过一些微小的类型检查工作,而需要在没有这些预检查的情况下复制涉及操作的所有其他代码(Python 2的int是C long底层实现,因此您可能会声明它为这样,并从直接使用原始C值中受益)。鉴于任意精度整数的复杂性,这是相当多的代码,并且完全不必要。如果您的值足够小,则可以将它们用作C类型,但对于任何较大的值,专门为它们进行优化的成本将大于收益。

简而言之:如果你想显式声明,将其声明为object或者不声明任何类型。你试图做的事情没有任何好处,而且实际上你也无法这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接