Python比其他脚本语言更强类型.例如,在Perl中:
perl -E '$c=5; $d="6"; say $c+$d' #prints 11
但是在Python中:
>>> c="6"
>>> d=5
>>> print c+d
Traceback (most recent call last):
File "", line 1, in
TypeError: cannot concatenate 'str' and 'int' objects
Perl将检查字符串并转换为数字,并且+ - / * **运算符按预期使用数字.PHP类似.
Python用于+连接字符串,因此尝试的操作c+d失败,因为c是一个字符串,d是一个int.Python 比Perl 具有更强的数字类型感.好的 - 我可以解决这个问题.
但考虑一下:
>>> from sys import maxint
>>> type(maxint)
>>> print maxint
9223372036854775807
>>> type(maxint+2)
>>> print maxint+2
9223372036854775809
>>> type((maxint+2)+maxint)
>>> print ((maxint+2)+maxint)
18446744073709551616
现在Python 将从一个int 自动推进,在这种情况下,它是64位长(OS X,python 2.6.1)到python long int,它具有任意精度.即使类型不同,它们也是相似的,Python允许使用通常的数字运算符.通常这很有帮助.例如,它有助于平滑32位和64位之间的差异.
从转换int到long是单向的:
>>> type((maxint+2)-2)
转换完成后,该变量的所有操作现在都以任意精度完成.任意精度操作比原生int操作慢几个数量级.在我正在处理的脚本上,我会有一些执行是快速的,其他因为这个延长到几个小时.考虑:
>>> print maxint**maxint # execution so long it is essentially a crash
所以我的问题是:有没有办法打败或不允许将Python自动推广int到Python long?
编辑,跟进:
我收到了几条评论,形式为'为什么你想要C风格溢出行为?' 问题是这段特殊的代码在C和Perl(带use int)中的32位上运行正常,带有C的溢出行为.尝试将此代码移植到Python失败了.Python的不同溢出行为最终成为问题的(部分).代码中有许多不同的习语(C,Perl,某些python)混合在一起(和那些评论混合在一起),所以它具有挑战性.
基本上,正在进行的图像分析是基于盘的高通滤波器以执行类似的图像比较.部分高通滤波器具有两个大多项式的基于整数的乘法.溢出本质上是一种"不关心,它很大......"的逻辑,因此结果与基于C的溢出一样.因此,使用具有O(n 2)时间的Horner规则是一种浪费,因为较大的多项式只是"大" - 粗略正义形式的carot-top饱和算法.
将基于循环的多项式乘法更改为FFT的形式可能要快得多.对于Horner的规则多项式乘法,FFT以接近线性的时间与O(n 2)运行.从光盘到内存也将加速这一进程.图像并不是非常大,但原始代码是在它们被认为是"巨大!!!"的时候编写的.代码所有者还没准备好丢弃他心爱的代码,所以我们会看到.他的'正确答案'可能只是保留Perl或C,如果他想要那个代码.
谢谢你的回答.我不知道Python的十进制模块,这似乎最接近我的要求 - 即使在这种情况下还有其他问题需要解决!