随机数生成器的性能结果冲突

时间:2018-03-09 20:34:53

标签: python performance numpy random timeit

来自我的question on Code-Review,对随机数生成库的性能进行了一些分析,特别是python和numpy的random工具。可以假设不同机器上的性能会有一些差异,但总体结论是相同的,xy快。但事实并非如此。

Oscar Smith's answer中,他进行了测试,得到了以下结果,在Ubuntu,Python 2.7和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

我执行了相同的测试,得到了相反的结果,在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

1 个答案:

答案 0 :(得分:4)

你使用的是非常古老的NumPy版本,NumPy 1.7.1。从那以后,numpy.random变得越来越复杂。

例如,比较numpy.random.uniform的{​​{3}}和1.14.1实现,1.14.1实现涉及锁定,并为low支持数组喜欢做额外的工作和high。 1.7.1不这样做。

numpy.random.randint(您在Code Review问题中使用的)也变得更加复杂。比较1.7.11.14.1实现,1.14.1实现包括一个锁,dtype的动态调度,以及Python级API的大量使用,所有这些都增加了每个调用的开销。 1.7.1的实现更为直接。