Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇:有多快?_Python_Largenumber_Computation - Fatal编程技术网

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