以下两种实现在计算性能和内存消耗方面有区别吗?
区别在于是否首先将中间计算存储到单独的变量 (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)
从技术上来说,这两个方法的字节码不匹配。您可以使用
dis.dis()
来向您展示这一点。在 python 3.12 下,一旦你整理了顺序并删除了所有重复的字节码,你就剩下了第二种方法的两个附加指令:
228 STORE_FAST 2 (S_corrected)
262 LOAD_FAST 2 (S_corrected)
迂腐地向我建议第一种方法可能更快,尽管我不太确定操作顺序略有不同。您可以使用
timeit.timeit()
尝试找出一百万个调用中的差异,但我的直觉告诉我,任何观察到的差异都是可疑的。
无论如何,我觉得第二个更清晰,我会使用它。