随机数生成器的相互矛盾的性能结果
Conflicting performance results of random number generators
来自我的 question on Code-Review,对随机数生成库的性能进行了一些分析,特别是 python 和 numpy 的 random
设施。人们会假设在不同的机器上会有一些性能差异,但总体结论是一样的,x
比 y
快。然而,事实并非如此。
在Oscar Smith's answer中,他进行了测试,得到了如下结果,运行 on Ubuntu, Python 2.7 and 3.6, NumPy 1.14.1:
timeit.timeit('rand(0,1000)', setup='from numpy.random import uniform as rand')
0.7485988769913092
timeit.timeit('rand(0,1000)', setup='from random import uniform as rand')
0.2676771300029941
我进行了同样的测试,得到了相反的结果,运行 on RHEL 7.4, Python 2.7.5, NumPy 1.7.1:
timeit.timeit("rand(0, 1000)", setup="from numpy.random import uniform as rand")
0.1250929832458496
timeit.timeit("rand(0, 1000)", setup="from random import uniform as rand")
0.47645998001098633
我希望这些值会不同,但比例相同,即他会得到 0.5, 0.1
,而我会得到 0.25, 0.05
。然而,我们得到了截然相反的结果。这里发生了什么?如果可能的话,官方认为哪个库更快?
一个有趣的旁注,运行 在在线解释器 https://repl.it/languages/python3 中,原生 python 更快:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
import timeit
import numpy
numpy.__version__
=> '1.14.1'
timeit.timeit('rand(0,1000)', setup='from numpy.random import uniform as rand')
=> 2.416280833000201
timeit.timeit('rand(0,1000)', setup='from random import uniform as rand')
=> 1.0206557700003032
您使用的是非常旧的 NumPy 版本,NumPy 1.7.1。 numpy.random
从那时起变得更加复杂。
例如,比较 numpy.random.uniform
的 1.14.1 and 1.7.1 实现,1.14.1 实现涉及锁并做额外的工作来支持 array-likes low
和 high
。 1.7.1 没有这样做。
numpy.random.randint
(您在代码审查问题中使用的)也变得更加复杂。与 1.14.1 and 1.7.1 实施相比,1.14.1 实施包括锁、按 dtype 动态分派和大量使用 Python-level API,所有这些都增加了 per-call 开销。 1.7.1 的实现更加直接。
来自我的 question on Code-Review,对随机数生成库的性能进行了一些分析,特别是 python 和 numpy 的 random
设施。人们会假设在不同的机器上会有一些性能差异,但总体结论是一样的,x
比 y
快。然而,事实并非如此。
在Oscar Smith's answer中,他进行了测试,得到了如下结果,运行 on Ubuntu, Python 2.7 and 3.6, NumPy 1.14.1:
timeit.timeit('rand(0,1000)', setup='from numpy.random import uniform as rand')
0.7485988769913092
timeit.timeit('rand(0,1000)', setup='from random import uniform as rand')
0.2676771300029941
我进行了同样的测试,得到了相反的结果,运行 on RHEL 7.4, Python 2.7.5, NumPy 1.7.1:
timeit.timeit("rand(0, 1000)", setup="from numpy.random import uniform as rand")
0.1250929832458496
timeit.timeit("rand(0, 1000)", setup="from random import uniform as rand")
0.47645998001098633
我希望这些值会不同,但比例相同,即他会得到 0.5, 0.1
,而我会得到 0.25, 0.05
。然而,我们得到了截然相反的结果。这里发生了什么?如果可能的话,官方认为哪个库更快?
一个有趣的旁注,运行 在在线解释器 https://repl.it/languages/python3 中,原生 python 更快:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
import timeit
import numpy
numpy.__version__
=> '1.14.1'
timeit.timeit('rand(0,1000)', setup='from numpy.random import uniform as rand')
=> 2.416280833000201
timeit.timeit('rand(0,1000)', setup='from random import uniform as rand')
=> 1.0206557700003032
您使用的是非常旧的 NumPy 版本,NumPy 1.7.1。 numpy.random
从那时起变得更加复杂。
例如,比较 numpy.random.uniform
的 1.14.1 and 1.7.1 实现,1.14.1 实现涉及锁并做额外的工作来支持 array-likes low
和 high
。 1.7.1 没有这样做。
numpy.random.randint
(您在代码审查问题中使用的)也变得更加复杂。与 1.14.1 and 1.7.1 实施相比,1.14.1 实施包括锁、按 dtype 动态分派和大量使用 Python-level API,所有这些都增加了 per-call 开销。 1.7.1 的实现更加直接。