NumPy解释器是否自动优化运算?括号能否强制矩阵运算顺序?
NumPy矩阵运算顺序的疑问解答
Python默认会按左到右的朴素顺序执行吗?
对NumPy的@矩阵乘法运算符来说,Python默认遵循左结合的运算规则,也就是会按照(A @ B.T) @ x的顺序计算。这种方式会先生成一个m×m的中间矩阵,再和x相乘,当m很大时,会占用大量内存且计算效率低下。添加括号能否强制指定运算顺序?
完全可以。写成result = A @ (B.T @ x)时,括号会强制NumPy先计算B.T @ x:这一步会得到一个n×1的向量,再用A和这个向量相乘,全程不会生成m×m的大中间矩阵,能显著提升计算效率、降低内存消耗。Python会忽略括号认为表达式等价吗?
不会。括号的优先级高于运算符的结合性,这两种写法的运算路径完全不同:前者产生m×m的中间矩阵,后者产生n×1的中间向量,NumPy会严格按照括号指定的顺序执行,二者并不等价。
可以用简单代码验证效率差异:
import numpy as np # 设定较大的m值,放大差异 m = 2000 n = 100 A = np.random.rand(m, n) B = np.random.rand(m, n) x = np.random.rand(m, 1) # 默认左结合顺序 %timeit (A @ B.T) @ x # 括号指定的优化顺序 %timeit A @ (B.T @ x)
运行后能明显看到第二种方式的运行时间远短于第一种,证明括号确实改变了运算顺序。
内容的提问来源于stack exchange,提问作者LSR
相关产品推荐
相关产品推荐

