我想用 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 循环以加速它。