python - 返回新数组和修改传入数组的性能

标签 python python-2.7 numpy

[Related ]

在下面的快照中,我比较了

的速度
  • 通过切片赋值修改现有数组
  • 仅返回一个新的、修改过的数组

看来后者更快。为什么会这样?

<小时/>

编辑:更新了建议,以及使用 numpy 的矢量化 add() 的版本,这是现在最快的。

enter image description here

最佳答案

我对 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/

相关文章:

python - socket.gethostbyaddr() 在某些计算机上返回错误,而在其他计算机上不返回错误

python - 2D 可变迭代器/生成器

python - 为什么我的交换功能交换到位?

python - 将段落分割成句子

python - 在 python 中添加一周一小时列

python-2.7 - Python cv2 图像金字塔

python - 使用 Django ORM 中多对一表中的值查询不同的模型实例

python - SELECT COUNT(distinct CASE WHEN x > y THEN seller_id ELSE NULL END) FROM 表 GROUP BY 列 PANDAS 等效项

python - 使用 Selenium 和 Python 通过单击而不使用 url 下载文件

python - 使用 beautiful soup 抓取数据时网页表结构出现问题