【问题标题】:Conflicting performance results of random number generators随机数生成器的性能结果冲突
【发布时间】:2018-03-09 20:34:53
【问题描述】:

来自我的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

【问题讨论】:

  • 每次扫描是在什么操作系统上执行的?使用了哪些版本的 Python?
  • 另外,什么版本的 NumPy?
  • RHEL 7.4,python 2.7.5,numpy 1.7.1
  • 顺便说一句,我分别得到 1.9424261669996667 和 4.202998832999583(是的,真的很慢)。 iPad 运行 iOS 9、Python 3.6.1、NumPy 1.8.0
  • @ForceBru 谢天谢地,我没有在 iPad 上运行我的 sim。

标签: python performance numpy random timeit


【解决方案1】:

您使用的是非常旧的 NumPy 版本,NumPy 1.7.1。从那时起,numpy.random 变得更加复杂。

例如,比较numpy.random.uniform1.14.11.7.1 实现,1.14.1 实现涉及一个锁,并做了额外的工作来支持lowhigh 的类似数组。 1.7.1 没有这样做。

numpy.random.randint(您在代码审查问题中使用的)也变得更加复杂。比较1.14.11.7.1 实现,1.14.1 实现包括锁、dtype 动态分派和大量使用 Python 级 API,所有这些都增加了每次调用的开销。 1.7.1 的实现要直接得多。

【讨论】:

  • 是的,但是为什么会导致 numpy 在一台机器上获胜 3 倍,而在另一台机器上失败 3 倍。
  • @JamesKPolk:侥幸。这个比率并不像看起来那样完全颠倒。在 Oscar 的测试中,NumPy 需要 2.8 倍,而在 Drise 的测试中,random 需要 3.8 倍。
  • @user2357112 我的意思是,这似乎仍然是一个足够体面的差异,值得进一步调查,因此我们在这里。
  • @Drise:我已经解释了为什么numpy.random.randint 的每次调用开销比以前更多。这就是放缓的来源。 numpy.random.randintrandom.randint 的运行时比率乍一看似乎完全颠倒了,但事实并非如此,而且没有什么更深层次的东西可以推动完全颠倒。
  • @user2357112 我在在线解释器中进行了测试,看起来它支持您的结论。使用 numpy 1.14.1 时,使用 python 比 numpy 速度提高 2.4 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2020-01-13
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2020-03-02
相关资源
最近更新 更多