【问题标题】:How to efficiently use Python-style integers in Cython?如何在 Cython 中有效地使用 Python 风格的整数?
【发布时间】:2021-08-28 15:30:55
【问题描述】:

我在 Cython 工作,我需要使用 Python 的 int 类型,而不是 C 的 int 类型。如何将 Cython 变量声明为 Python 样式的整数?

cdef int x 将使用 C 风格的整数,而不是 Python 风格的整数。

cdef object x 可以存储 Python 风格的整数,但由于冗余的运行时类型检查,它会很慢。

如果我 100% 知道一个对象将是 int,我可以避免运行时类型检查吗?

Cython docs 似乎表明将其声明为object 是我们能做的最好的事情,我们只需要忍受冗余。这感觉与 Cython 不同,我不完全相信我正确解释了文档。

甚至可以按照我的要求做吗?

【问题讨论】:

    标签: python types integer cython static-typing


    【解决方案1】:

    The docs 非常清楚(已添加重点):

    Python 类型 intlongfloat 不可用于静态类型,而是分别解释为 C intlongfloat作为静态类型变量使用这些 Python 类型的优势为零。

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

    简而言之:将其声明为无,或 object 如果您想明确表示。您尝试做的事情没有任何好处,而且您不能在任何情况下都这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多