根据计算表达式是直接返回还是先存储在变量中然后返回而实现的差异

问题描述 投票:0回答:1

以下两种实现在计算性能和内存消耗方面有区别吗?
区别在于是否首先将中间计算存储到单独的变量 (S_ Corrected) 中。
1)

def step(self, data_deriv: npt.NDArray) -> npt.NDArray:
        self.t += 1
        self.S = self.beta * self.S + (1 - self.beta) * data_deriv ** 2
        return data_deriv / np.sqrt((self.S / (1 - self.beta ** self.t)) + self.epsilon)


2)

def step(self, data_deriv: npt.NDArray) -> npt.NDArray:
        self.t += 1
        self.S = self.beta * self.S + (1 - self.beta) * data_deriv ** 2
        S_corrected = (self.S / (1 - self.beta ** self.t))
        return data_deriv / np.sqrt(S_corrected + self.epsilon)
python numpy performance memory
1个回答
0
投票

从技术上来说,这两个方法的字节码不匹配。您可以使用

dis.dis()
来向您展示这一点。在 python 3.12 下,一旦你整理了顺序并删除了所有重复的字节码,你就剩下了第二种方法的两个附加指令:

            228 STORE_FAST               2 (S_corrected)
            262 LOAD_FAST                2 (S_corrected)

迂腐地向我建议第一种方法可能更快,尽管我不太确定操作顺序略有不同。您可以使用

timeit.timeit()
尝试找出一百万个调用中的差异,但我的直觉告诉我,任何观察到的差异都是可疑的。

无论如何,我觉得第二个更清晰,我会使用它。

© www.soinside.com 2019 - 2024. All rights reserved.