题
我需要一个算法的速度比目前的正常Python长乘法运算。
我试图找到一个体面的Karatsuba实现,但我不能。
def main():
a=long(raw_input())
if(a<0):
a=a*-1
a=((a*(a+1)/2)-1)
print(-a)
else:
a=(a*(a+1))/2
print(a)
main()
正如你看到的,这是没有什么复杂的,只有几次乘法。但是它已经处理的数字与最100000数字低于2.5微秒。
我想要一些片段的一个函数,或只是一个链接到一些执行的乘法运算速度更快功能,或任何帮助。
其他提示
我是作者的DecInt(整数)图书馆,所以我只作几点评论。
该DecInt库是具体的设计工作有很大的整数需要被转换到小数点的格式。该问题转换为小格式是,大多数任意的-精确的库存值在二进制的。这是最快和最有效的利用存储器,但转换的二十进制的通常是缓慢的。蟒蛇的二十进制转换使用O(n^2)算法而得到缓慢的速度非常快。
DecInt使用大小基数(通常为10^250)和存储的数量非常大块的250的数字。转换成非常大的数十进制的格式现已运行在O(n)。
天真,或等级学校、乘有一个运行时间O(n^2).Python使用Karatsuba乘哪个有运行时间O(n^1.585).DecInt结合使用Karatsuba,Toom做的,夫努斯鲍默的卷积得到一个运行时间O(n*ln(n))。
即使DecInt具有高得多的开销,该组合的O(n*ln(n))乘法和O(n)转换将最终以更快的速度比Python O(n^1.585)乘法和O(n^2)转换。
由于大多数的计算不需要每一个的结果将显示在十进制的格式,几乎每一个任意的精库使用的二进制由于使计算较容易。DecInt目标的一个非常小的地位。足够大的数字,DecInt将以更快的速度的乘法和司比本地蟒蛇。但如果你是纯粹的性能、图书馆等GMPY将是最快的。
我很高兴你找到DecInt有帮助的。
15.9毫秒我缓慢的笔记本电脑。这是放慢你失望的打印。转换为二进制数十进制是相当缓慢的,这是打印出来的必要步骤。如果你需要输出的数量,您应该尝试DecInt ChristopheD已经提到的。
DecInt会慢做乘法,但使打印速度更快
In [34]: a=2**333000
In [35]: len(str(a))
Out[35]: 100243
In [36]: b=2**333001
In [37]: len(str(b))
Out[37]: 100244
In [38]: timeit c=a*b
10 loops, best of 3: 15.9 ms per loop
下面是与您的代码的一个略加修改的版本的示例。请注意,一个100000的数字串转换为长已经发生〜此计算机上1秒
In [1]: def f(a):
...: if(a<0):
...: a=a*-1
...: a=((a*(a+1)/2)-1)
...: else:
...: a=(a*(a+1))/2
...: return a
...:
In [2]: a=3**200000
In [3]: len(str(a))
Out[3]: 95425
In [4]: timeit f(a)
10 loops, best of 3: 417 ms per loop
我建议你在贤者数学工具,这已几乎所有Python的数学工具有史以来热轧在一个封装中。看看是否有在圣人一个不错的快速任意精度的数学工具,满足您的需求。