问题
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中进行大量数值计算,因此想从那些实际处理这种差异可能很重要的问题的人那里了解情况。
我认为是这样的,但还有其他简单的方法来实现相同的性能而使语句更加简单吗?
背景
临时复制演示了临时复制的影响。
问题在于还有许多其他情况需要创建这样的副本,这会影响性能...
- 代码与参考文献中的代码不同。
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上的jupyter笔记本中运行,使用1CPU 8核
- numpy 1.19.2
- Python 3.8.5 (默认版本,Sep 4 2020, 07:30:14) [GCC 7.3.0]
np.add(X, 2*Y, out=X)
中,首先为2*Y
的结果分配内存,然后再为np.add(X, TMP, out=X)
的结果分配内存。还有其他一些包可以获得更好的性能,例如numexpr https://numexpr.readthedocs.io/en/latest/intro.html#expected-performance。 - max9111