首页 > 解决方案 > 如何将 Python 无限大整数转换为 Cython?

问题描述

我想用 Cython 分解非常大的数字(例如 100 位、200 位数字)。

大家好,我在 Python 3.6 中实现了用于因式分解的椭圆曲线方法。现在,我想使用 Cython(版本 29.13)加速我的代码。我是 Cython 世界的初学者,但我知道如果我为变量定义类型,Cython 会更好。因此,我将所有 Python 类转换为 Cython 类,现在我想对变量进行类型化。我读到 Cython 自动将“cdef int”声明转换为具有无限长度的经典 Python 整数,但事实并非如此。
当我尝试分解这样的数字“5192296858543544183479685583896053”时,我得到:

由于“int is to big to convert into C long”而导致的溢出错误。

有什么方法可以声明巨大的整数来加速我的代码吗?唯一没有类型声明的变量是可能是非常大的整数的变量。

PS:我已经尝试使用 cpython 类型 uPY_LONG_LONG (unsigned long long) 但它没用,因为我总是遇到同样的错误。


[更新]

如果我声明这样的事情:

cdef int function():
    cdef int a
    a = 2**100
    return a

因为 2**100 太大而无法将其转换为整数,所以我得到了一个 OverflowError。

如果我从 cpython 导入长类型,我会得到同样的错误:

from cpython import long as Long
cdef Long function():
      cdef Long a
      a = 2**100
      return a

如果我从 cpython 导入 int 类型,我不会收到错误,但我没有加速:

from cpython import int as Integer
cdef Integer function():
      cdef Integer a
      a = 2**100
      return a

如果我分析作为翻译创建的 C++ 代码,我注意到变量a已被声明为指向 PyObject 的指针。如果我不声明变量,这与我得到的翻译完全相同。因此,也许在这种情况下没有区别。我无法改进我使用的所有 for 循环,因为我有这样的东西:

for x in range(p):
     .....

但是如果 p 是一个巨大的整数并且 Cython 将 p 和 x 声明为指向 PyObject 的指针,Cython 可以将此循环转换为 C 循环以加速它。

标签: pythoncythonunsigned-long-long-int

解决方案


推荐阅读