python - 如何将 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 循环以加速它。
解决方案
推荐阅读
- android - getOr、put() 和 edit() 无法在 org.androidannotations:androidannotations 中解析
- mysql - 我可以从表创建中进行限制吗?
- javascript - jQuery事件委托查询
- python - 创建具有多个下拉菜单的虚线图
- aginity - Aginity Pro 打不开
- python - Julia >=1.3 和 Python 3.x 中的多线程模型比较
- python - PyCharm 不通过内置运行运行项目,而是在终端中运行
- jenkins - 如何访问在 Jenkins 构建步骤中传递给参数化作业的空参数?
- html - 幽灵下划线甚至文本装饰都没有
- r - 规范化没有列名的数据集