[Related ]
在下面的快照中,我比较了
的速度- 通过切片赋值修改现有数组
- 仅返回一个新的、修改过的数组
看来后者更快。为什么会这样?
<小时/>编辑:更新了建议,以及使用 numpy 的矢量化 add()
的版本,这是现在最快的。
最佳答案
我对 python/numpy 内部结构了解不多,但我假设正在发生以下情况。仅通过查看代码,我得到的印象是 finline
所做的工作比 freturn
更多,自 finline
具有 freturn
的所有陈述确实( x + 1.0
)等等。
也许这可以解释发生了什么:
>>> x = np.random.rand(N)
>>> y = np.zeros(N)
>>> super(np.ndarray, y).__repr__()
Out[33]: '<numpy.ndarray object at 0x24c9c80>'
>>> finline(x, y)
>>> y # see that y was modified
Out[35]:
array([ 1.92772158, 1.47729293, 1.96549695, ..., 1.37821499,
1.8672971 , 1.17013856])
>>> super(np.ndarray, y).__repr__()
Out[36]: '<numpy.ndarray object at 0x24c9c80>' # address of y did not change
>>> y = freturn(x)
>>> super(np.ndarray, y).__repr__()
Out[38]: '<numpy.ndarray object at 0x24c9fc0>' # address of y changed
本质上,我认为 finline
正在做更多的工作,因为它必须迭代 y 的元素并将每个元素初始化为 x + 1.0
返回的数组手术。另一方面,y = freturn(x)
可能只是重新初始化 y
的值指针等于 x + 1.0
初始化的数组的地址操作。
关于python - 返回新数组和修改传入数组的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746707/