问题
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/