El período de Mersenne Twister utilizado en el módulo random
es (me dicen) 2 ** 19937 - 1. Como un número binario, eso es 19937 '1 en una fila (si no me equivoco). Python lo convierte en decimal muy rápido:Python: ¿qué tan rápido?
$ 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
Supongo que la segunda versión es la que requiere conversión?
Y no es solo binario. Esto también es rápido. (En lugar de mostrar los números, se muestra la longitud del punto decimal convierte en una cadena):
>>> 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
Tiempo:
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
La pregunta es: ¿cómo es esto en realidad hecho?
¿Soy ingenuo para quedar impresionado? Encuentro que la visión de la cáscara de Python genera aproximadamente 5000 lugares en un instante realmente espectacular.
Editar:
tiempos adicionales sugeridas por @dalke y @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
por lo que parece a mí como result = 0; result += 2**19937
probablemente hace forzar la conversión.
Ver http://stackoverflow.com/questions/ 867393/how-do-languages-such-as-python-overcome-cs-integral-data-limits – wich
Nunca calculó el número entero de Python para basar la conversión 10. Necesitas hacer: timeit 'str (2 ** 19937)'. Y su segunda prueba de tiempo realmente está computando la capacidad de Python para agregar números grandes. No hay conversión pasando allí tampoco. –
Está claro que str() está forzando la conversión. Hay un factor de desaceleración de 70 para ese frente al paso de adición simple. –