gpt4 book ai didi

python - Numpy:为什么 are.mean() 比 array.sum()/array.size 慢

转载 作者:行者123 更新时间:2023-12-05 02:27:52 24 4
gpt4 key购买 nike

我测量了两个等效函数的运行时间,这两个函数使用 timeit 模块计算 numpy 数组(一维和二维)的平均值:

>>> setup = 'import numpy as np;a=np.random.randint(100, size=(100,100));b=np.random.randint(100, size=1000)'
>>> timeit.timeit(setup=setup, stmt='a.mean()')
13.513522000001103
>>> timeit.timeit(setup=setup, stmt='a.sum()/a.size')
6.080089200000657
>>> timeit.timeit(setup=setup, stmt='b.mean()')
5.404982399999426
>>> timeit.timeit(setup=setup, stmt='b.sum()/b.size')
2.261378399998648

令人惊讶的是,无论数组的大小如何,numpy.ndarray.mean 方法都比 numpy.ndarray.sum()/numpy.ndarray.size 慢。

谁能解释一下?提前致谢!

最佳答案

np.sumnp.mean 在内部对不同的 native 数据类型进行操作。实际上,np.mean 在内部将所有项目转换为 np.float64 类型,因此创建了一个昂贵的新临时数组。 np.sum 直接对 np.int32 整数进行运算(在主流 x86-64 处理器上可以更高效地计算)。要模仿 np.mean 的行为,您可以使用 b.sum(dtype=np.float64)/b.size 指定累加器/输出类型。由此产生的性能更接近 np.mean。有关这方面的更多信息,请考虑阅读 this postthis one .请注意,如果整数很大,np.sum 可能会发生溢出(与np.mean 相比,会导致完全错误的结果)。

此外,np.mean 有一个更高(恒定)的开销,因为它在内部实现的方式(它进行了一般性的减少,并且完成了更多的检查和调用的函数)。这种开销是几乎所有 Numpy 函数所固有的,但对于某些函数来说,它可能会大得多。 hHis 部分可以优化,我们之前做了一些减少它的工作,但是需要修改很多代码以使其更快,而且到目前为止这不是关键点(Numpy 不是为在非常小的数组上操作而设计的,几乎不能是因为 CPython 导致需要完成大量检查)。如果将数组大小设置为 200_000,那么 b.mean()b.sum(dtype=np.float64)/b.size 的执行时间应该是非常接近(我的机器上就是这种情况)。

关于python - Numpy:为什么 are.mean() 比 array.sum()/array.size 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72863063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com