在模块
问题是:这到底是怎么做到的?
我只是天真地被深深地打动了吗?我觉得Python shell瞬间生成大约5000个数字的景象真是壮观。
编辑:
@dalke和@truppo建议的额外计时。
random
中使用的Mersenne Twister的周期(据我所知)是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 shell瞬间生成大约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
可能会强制转换。