如何在 Cython 中有效地使用 Python 风格的整数?
How to efficiently use Python-style integers in Cython?
我在 Cython 工作,我需要使用 Python 的 int
类型,而不是 C 的 int
类型。如何将 Cython 变量声明为 Python 样式的整数?
cdef int x
将使用 C 风格的整数,而不是 Python 风格的整数。
cdef object x
可以存储一个 Python 类型的整数,但是由于冗余的运行时类型检查,它会很慢。
如果我 100% 知道某个对象将成为 int
,我可以避免运行时类型检查吗?
Cython docs 似乎表明将其声明为 object
是我们能做的最好的,我们只需要忍受冗余。这感觉不符合 Cython 的特点,我不完全相信我对文档的解释是正确的。
甚至可以按照我的要求做吗?
The docs 很清楚(强调):
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 与 list
、tuple
等相关,其中静态类型提供了一个有意义的好处,允许 Cython 通过编译有效的代码来节省时间在更具侵入性的层面上使用它们(例如,直接访问 list
和 tuple
的底层数组)。对于 Python 3 的 int
(以及 Python 2 的 long
),这种优势基本上不存在; Cython 充其量可以跳过 极小 数量的类型检查工作,以换取需要在没有这些预检查的情况下重现操作中涉及的所有其余代码(Python 2 int
是一个 C long
引擎盖下的,所以你也可以这样声明它并从直接使用原始 C 值中受益)。考虑到使用任意精度整数的复杂性,它是相当多的代码,而且完全没有必要。如果您的值足够小,您可以将它们用作 C 类型,但对于任何更大的值,专用于它们的成本将大于收益。
简而言之:将其声明为无,或者 object
如果您想明确。您尝试做的事情没有任何好处,而且您不能无论如何都做不到。
我在 Cython 工作,我需要使用 Python 的 int
类型,而不是 C 的 int
类型。如何将 Cython 变量声明为 Python 样式的整数?
cdef int x
将使用 C 风格的整数,而不是 Python 风格的整数。
cdef object x
可以存储一个 Python 类型的整数,但是由于冗余的运行时类型检查,它会很慢。
如果我 100% 知道某个对象将成为 int
,我可以避免运行时类型检查吗?
Cython docs 似乎表明将其声明为 object
是我们能做的最好的,我们只需要忍受冗余。这感觉不符合 Cython 的特点,我不完全相信我对文档的解释是正确的。
甚至可以按照我的要求做吗?
The docs 很清楚(强调):
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
等相关,其中静态类型提供了一个有意义的好处,允许 Cython 通过编译有效的代码来节省时间在更具侵入性的层面上使用它们(例如,直接访问 list
和 tuple
的底层数组)。对于 Python 3 的 int
(以及 Python 2 的 long
),这种优势基本上不存在; Cython 充其量可以跳过 极小 数量的类型检查工作,以换取需要在没有这些预检查的情况下重现操作中涉及的所有其余代码(Python 2 int
是一个 C long
引擎盖下的,所以你也可以这样声明它并从直接使用原始 C 值中受益)。考虑到使用任意精度整数的复杂性,它是相当多的代码,而且完全没有必要。如果您的值足够小,您可以将它们用作 C 类型,但对于任何更大的值,专用于它们的成本将大于收益。
简而言之:将其声明为无,或者 object
如果您想明确。您尝试做的事情没有任何好处,而且您不能无论如何都做不到。