Python 将cython与大int一起使用时发生溢出错误
python 3.4、windows 10、cython 0.21.1 我正在用cython将这个函数编译成cPython 将cython与大int一起使用时发生溢出错误,python,python-3.x,cython,Python,Python 3.x,Cython,python 3.4、windows 10、cython 0.21.1 我正在用cython将这个函数编译成c def weakchecksum(data): """ Generates a weak checksum from an iterable set of bytes. """ cdef long a, b, l a = b = 0 l = len(data) for i in range(l): a += data[i]
def weakchecksum(data):
"""
Generates a weak checksum from an iterable set of bytes.
"""
cdef long a, b, l
a = b = 0
l = len(data)
for i in range(l):
a += data[i]
b += (l - i)*data[i]
return (b << 16) | a, a, b
def weakchecksum(数据):
"""
从一组可编辑的字节生成弱校验和。
"""
cdef长a、b、l
a=b=0
l=len(数据)
对于范围(l)中的i:
a+=数据[i]
b+=(l-i)*数据[i]
return(bcython将pyx文件编译为C,因此它依赖于底层C编译器
C中整数类型的大小在不同的平台和操作系统上有所不同,C标准并没有规定具体的实现
然而,有事实上的执行公约
32位和64位Windows使用4个字节(32位)表示int
和long
,8个字节(64位)表示long
。Win32和Win32之间的区别在于指针的大小(Win32为32位,Win32为64位)。(请参阅MSDN中的]
Linux使用另一种模式:int
对于Linux-32和Linux-64都是32位,long
始终是64位。long
指针不同:Linux-32上是32位,Linux-64上是64位
长话短说:如果您需要整数类型的最大容量,而该类型在不同平台上没有更改,请使用Long-Long
(或unsigned-Long
)
long-long
的数据范围是[-9223372036854775808,9223372036854775807]
如果您需要具有任意精度的数字,则有一个事实上的高精度算术标准。Python为其调用了wrapper。如果您确保您的计算是用c进行的(例如,将i声明为long,并将数据元素放入cdefed变量或在计算之前强制转换),您不会得到此错误。但是,您的实际结果可能会因平台而异,具体取决于(可能)生成的确切汇编代码和溢出的处理。正如@cod3monk3y所指出的,有更好的算法可以解决此问题(请查看“简单校验和”链接).cdef long long如何?
?同样的错误,导致它的数字是2891688164113197考虑创建一个大整数类?它将是一个包含数字的链表。是的,我考虑过,我正在使用cython来加速一些代码,并希望避免创建特殊类,从而增加gcc上的开销Ubuntu14.04,大约是9.2e+18,距离极限。h它正好是define LLONG_MAX 9223372036854775807LL
see;unsigned long long long更大。是的,你在windows上看到了,但这应该是关于多少位适合硬件级算法的。所以我在cdef语句中添加了'I'并重新运行了它。仍然得到了相同的错误。还有ied cdef long long a、b、l、iTrycdef long d…
(循环中)d=data[i]
或在计算中使用d
(或使用data[i]
)。您可以使用一个标志进行编译,以查看注释中使用python行生成的实际c代码——您应该看到,当没有涉及python变量时,计算是一个直接的c表达式。(注意:由于某些原因,我无法在标记中正确拼写:))完美。。我已经放弃了这个问题的答案。成功了。你是个天才。对于你们这些在未来阅读这篇文章的人。我声明cdef长为a、b、l、I、d,并将对数据[I]的每个引用都更改为d。