Python 蟒蛇:有多快?
模块Python 蟒蛇:有多快?,python,largenumber,computation,Python,Largenumber,Computation,模块random中使用的Mersenne捻线器的周期(我被告知)为2**19937-1。作为一个二进制数,这是一行19937'1(如果我没弄错的话)。Python将其转换为十进制非常快: $ python -m timeit '2**19937' 10000000 loops, best of 3: 0.0271 usec per loop $ python -m timeit -s 'result = 0' 'result += 2**19937' 100000 loops, best of
random
中使用的Mersenne捻线器的周期(我被告知)为2**19937-1。作为一个二进制数,这是一行19937'1(如果我没弄错的话)。Python将其转换为十进制非常快:
$ python -m timeit '2**19937'
10000000 loops, best of 3: 0.0271 usec per loop
$ python -m timeit -s 'result = 0' 'result += 2**19937'
100000 loops, best of 3: 2.09 usec per loop
我猜第二个版本是需要转换的版本
它不仅仅是二进制的。这也很快。(我没有显示数字,而是显示转换为字符串的十进制长度):
时间:
python -m timeit -s 'import math' -s 'N=1000' 's = str((int(N*math.e))**(int(N*math.pi)))'
10 loops, best of 3: 51.2 msec per loop
问题是:这实际上是如何做到的
我是不是太天真了?我发现pythonshell在瞬间生成了5000个左右的位置,这真是太壮观了
编辑:
@dalke和@truppo建议的额外时间
$ python -m timeit 'x=2' 'x**19937'
1000 loops, best of 3: 230 usec per loop
$ python -m timeit 'x=2' 'int(x**19937)'
1000 loops, best of 3: 232 usec per loop
$ python -m timeit 'x=2' 'str(x**19937)'
100 loops, best of 3: 16.6 msec per loop
$ python -m timeit -s 'result = 0' 'x = 2' 'result += x**19937'
1000 loops, best of 3: 237 usec per loop
$ python -m timeit -s 'result = 0' 'x = 2' 'result += x**19937' 'int(result)'
1000 loops, best of 3: 238 usec per loop
$ python -m timeit -s 'result = 0' 'x = 2' 'result += x**19937' 'str(result)'
100 loops, best of 3: 16.6 msec per loop
因此,在我看来,
result=0;result+=2**19937
可能会强制进行转换。我不想在你的游行中大肆渲染,但它如此之快的原因是数学模块实际上没有用Python实现
Python支持加载导出Python API的共享库,但这些库是用其他语言实现的。math.so,它提供了您从导入math中获得的模块,恰好是其中的一个(也是_random.so)。我对Python中如何实际实现这一点知之甚少,但考虑到这基本上是原语乘法和对数,即使在相当大的数字上,它的速度也相当快,我并不感到非常惊讶 有任意精度的数学库,例如,它们以一种非常有效的方式实现了各种各样的操作,并为此目的在汇编中进行了优化 Python非常快地将其转换为十进制
我不知道Python,但是不,它不需要这样做。2^19937不需要计算,它只是一个二进制移位(“当编译为字节码时,
2**19937
等常量表达式将优化为单个常量:
>>> def foo(): return 2**10
...
>>> import dis
>>> dis.dis(foo)
1 0 LOAD_CONST 3 (1024)
3 RETURN_VALUE
>>>
相反,请考虑:
[~] python -m timeit 'x=2' 'x**19937'
1000 loops, best of 3: 210 usec per loop
请注意,您从未对Python的整数到基数10的转换进行过计时。您需要执行以下操作:timeit'str(2**19937)。您的第二个计时测试实际上是计算Python添加大量数字的能力。也没有进行任何转换。很明显,str()正在强制转换。与简单的加法步骤相比,这一步的速度要慢70倍。了解自己!:)哟!这就像用希腊语原版阅读一样。但我会尝试一下,谢谢。@telliott99继续,问我们这本字典有多快。@D@wisty我刚订了一份“美丽代码”,所以我相信我会找到的。(第18章)是安德鲁·库奇林就这个话题写的;)@Thorsten S.我显然有点不知所措,但我不太确定你是对的。乘法是一个简单的二进制移位,一旦你计算出要移位多少个位置,那么求幂怎么可能是一样的?这是乘法的第二步,以获得位置的数量,对吗?
[~] python -m timeit 'x=2' 'x**19937'
1000 loops, best of 3: 210 usec per loop