1.16.6 版本的 numpy.random.multinomial 比更高版本快 10 倍

Win*_*Guo 11 performance numpy multinomial

以下是代码和结果:

python -c "import numpy as np; from timeit import timeit; print('numpy version {}: {:.1f} seconds'.format(np.__version__, timeit('np.random.multinomial(1, [0.1, 0.2, 0.3, 0.4])', number=1000000, globals=globals())))"
Run Code Online (Sandbox Code Playgroud)
numpy version 1.16.6:  1.5 seconds # 10x faster
numpy version 1.18.1: 15.5 seconds
numpy version 1.19.0: 17.4 seconds
numpy version 1.21.4: 15.1 seconds
Run Code Online (Sandbox Code Playgroud)

值得注意的是,使用固定随机种子,不同 numpy 版本的输出是相同的

python -c "import numpy as np; np.random.seed(0); print(np.__version__); print(np.random.multinomial(1, [0.1, 0.2, 0.3, 0.4], size=10000))" /tmp/tt
Run Code Online (Sandbox Code Playgroud)

关于为什么 1.16.6 之后的 numpy 版本慢 10 倍有什么建议吗?

我们已经将 pandas 升级到最新版本 1.3.4,需要 1.16.6 之后的 numpy 版本

dan*_*444 2

我检查了引擎盖下的一些发电机,发现时序没有太大变化。

我猜差异可能是由于一些开销造成的,因为您只采样单个值。这似乎是一个很好的假设。当我将生成的随机样本的大小增加到 1000 个时,1.16.6 和 1.19.2(我当前的 Numpy 版本)之间的差异减少到约 20%。

python -c "import numpy as np; from timeit import timeit; print('numpy version {}: {:.1f} seconds'.format(np.__version__, timeit('np.random.
multinomial(1, [0.1, 0.2, 0.3, 0.4], size=1000)', number=10000, globals=globals())))"
Run Code Online (Sandbox Code Playgroud)
numpy version 1.16.6: 1.1 seconds
numpy version 1.19.2: 1.3 seconds
Run Code Online (Sandbox Code Playgroud)

请注意,两个版本都有此开销,只是较新的版本有更大的开销。在这两个版本中,对 1000 个值进行一次采样比对 1 个值进行 1000 次采样要快得多。

他们在 1.16.6 和 1.17.0 之间对代码进行了很大的更改,例如参见此提交,很难分析。抱歉,这无法更好地帮助您 - 我建议在 Numpy 的 github 上提出问题。