numpy(np.add(X,Y,out=X);np.add(X,Y,out=X))覆盖np.add(X,2*Y,out=X)

2024-09-25 00:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

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.9470899971616

环境

在Ubuntu20.04LTS上的jupyter笔记本上运行,1CPU 8核

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

Tags: 代码importnumpyaddasnpsetupones
1条回答
网友
1楼 · 发布于 2024-09-25 00:25:48

我相信速度的提升特别来自于操作2*Y对新内存的读写操作。我已经添加了另一个场景,您只需通过将Y添加到其自身来覆盖它,这也有点快

案例1:

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)

案例2:

内存中只有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有一个写入操作,Y有一个写入操作

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

相关问题 更多 >