【发布时间】:2022-01-30 05:38:51
【问题描述】:
为什么与单个函数调用相比,在重复调用的情况下,随机数的 numpy 生成要慢得多?
例子:
import numpy as np
import timeit
if __name__ == '__main__':
latency_normal = timeit.timeit('np.random.uniform(size=(100,))', setup = 'import numpy as np')
latency_normal_loop = timeit.timeit('[np.random.uniform(size=1) for _ in range(100)]', setup = 'import numpy as np')
rng = np.random.default_rng()
latency_generator = timeit.timeit('rng.uniform(size=(100,))', setup = 'import numpy as np')
latency_generator_loop = timeit.timeit('[rng.uniform(size=1) for _ in range(100)]', setup = 'import numpy as np')
print("latencies:\t normal: [{}, {}]\t generator: [{},{}]".format(latency_normal, latency_normal_loop, latency_generator, latency_generator_loop))
输出:
latencies: normal: [2.7388298519999807, 31.694285575999857] generator: [2.6634575979996953,31.0009219450003]
对于样本量较小的重复调用,是否有任何替代方法效果更好?
【问题讨论】:
-
python 是一种交互语言——每个函数调用都会产生开销。 Numpy 调用低级 C 编译的二进制文件。将代码移动到 numpy 而不是 python 是优化的第一步
-
是的,但我认为可以打开某种流来执行此类操作,以便只体验一次这种延迟?缓冲区始终是一种选择,但我觉得这不是一个功能很奇怪