Период Mersenne Twister, используемый в модуле random
, равен (мне сказали) 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
Полагаю, вторая версия требует преобразования?
И это не просто двоичный файл. Это тоже быстро. (Вместо того, чтобы показывать числа, я показываю длину десятичной дроби, преобразованной в строку):
>>> 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 мест в одно мгновение, действительно впечатляющим.
Edit:
Дополнительные временные параметры, предложенные @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
, вероятно, вызывает преобразование.