python - numpy - (np.add(X, Y, out=X); np.add(X, Y, out=X)) 在 np.add(X, 2*Y, out=X)

标签 python numpy

问题

np.add(X, 2*Y, out=X)np.add(X, Y, out=X); np.add(X, Y, out=X).使用 np.add(X, Y, out=X); 是一种实际做法吗? np.add(X, Y, out=X) 在现实世界中获得性能?我没有在 numpy 中进行过大量的数值计算,因此想从那些实际处理这种差异可能至关重要的问题的人那里了解。

我想是的,但是还有其他方法可以在实现性能的同时简化语句吗?

背景

Temporary copy演示临时复制的影响。

Problem is that there are many other cases where such copies needs to be created and this impact the performance...

  • 代码与引用文献中的不同。
import numpy as np
import timeit

setup = """
import numpy as np

X = np.ones(100000, dtype=np.int)
Y = np.ones(100000, dtype=np.int)
"""
iterations = 100000
elepased = timeit.timeit(
    stmt="np.add(X, 2*Y, out=X)",
    setup=setup,
    number=iterations
)
elepased / iterations * 1e6  

84.75939844996901

elepased = timeit.timeit(
    stmt="np.add(X, Y, out=X); np.add(X, Y, out=X)",
    setup=setup,
    number=iterations
)
elepased / iterations * 1e6  

57.947089899971616

环境

在 Ubuntu 20.04LTS,1CPU 8 核上的 jupyter notebook 中运行

  • numpy 1.19.2
  • Python 3.8.5(默认,2020 年 9 月 4 日,07:30:14)[GCC 7.3.0]

最佳答案

我认为速度的提升特别来自操作2*Y 对新内存的读写操作。我添加了另一种情况,您可以通过将 Y 添加到自身来简单地覆盖它,这也更快一些。

案例一:

X, Y, 2Y 必须在内存中,并有相应的读写。

Y = np.ones((10000,))
X = np.zeros((10000,))

#Case 1:
np.add(X, 2*Y, out=X) #Double Y, store somewhere, and add to X
13.3 µs ± 929 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

案例二:

只有X和Y在内存中,但是X有多次写操作。

Y = np.ones((10000,))
X = np.zeros((10000,))

#Case 2:
np.add(X, Y, out=X) #Add to X
np.add(X, Y, out=X) #Add to X again
12.8 µs ± 830 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

案例 3(最快):

只有X和Y在内存中,但是X有1次写操作,Y有1次写操作。

Y = np.ones((10000,))
X = np.zeros((10000,))

#Case 3:
np.add(Y, Y, out=Y) #double Y
np.add(X, Y, out=X) #then add to X
12.2 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

检查共享内存-

#2*Y is a brand new array in memory
print(np.shares_memory(Y, 2*Y))

#np.add(Y, Y, out=Y) Adding Y to itself shares memory
print(np.shares_memory(Y, np.add(Y, Y, out=Y)))
False
True

关于python - numpy - (np.add(X, Y, out=X); np.add(X, Y, out=X)) 在 np.add(X, 2*Y, out=X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65453999/

相关文章:

Python - 如何通过 AMQP lib 有效地将 50k 消息推送到 RabbitMQ?

python - 具有继承的 SQLAlchemy 类的一对一删除

python - 无法将 extra_option 与路径 django 一起使用

python - 属性错误 : 'numpy.float64' object has no attribute 'log10'

python - 下面的代码有更快的实现吗?

python - 如何让一个曲面通过四个点,求相邻点在曲面上的投影

python - 将列表推导式传递给 Python 中的函数

python - 正在寻找具有类似 Stylus 语法的 Python CSS 预处理器?

python - 计算每个元素相对于其列的百分位数分数

python - 如果存在于另一个数组中,则从一个数组中删除元素,保留重复元素 - NumPy/Python