モジュールで使用されているメルセンヌ ツイスターの周期random
は (聞いたところでは) 2**19937 - 1 です。2 進数としては、19937 '1 が連続しています (私の間違いでなければ)。Python はこれを非常に高速に 10 進数に変換します。
$ 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
変換が必要なのは 2 番目のバージョンだと思いますか?
そして、それは単なるバイナリではありません。これも速いです。(数字を表示するのではなく、文字列に変換された 10 進数の長さを表示します):
>>> import math
>>> N = 1000
>>> s = str((int(N*math.e))**(int(N*math.pi)))
>>> len(s)
10787
>>> N = 5000
>>> s = str((int(N*math.e))**(int(N*math.pi)))
>>> len(s)
64921
タイミング:
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
問題は、これが実際にどのように行われるかです。
私は感動するのが単純ですか?Python シェルが 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
したがって、おそらく変換を強制するように見えます。