操作:保存变量然后操作与单行

Operations: Saving in Variables Then Operating vs Single Liners

我正在 Python 中编写程序(使用 numpy 包)。我正在编写一个程序,其中包含一个涉及很多术语的非常长的函数:

result = a + b + c + d +...

...随便。 a、b、c、d等这些项……本身就是涉及很多操作的矩阵,例如Python代码中:

a = np.identity(3, dtype = np.double)/3.0
b = np.kron(vec1, vec2).reshape(3,3) # Also with np.double precision.

只是取了两个变量,我一直在想是不是在做:

a = np.identity(3, dtype = np.double)/3.0
b = np.kron(vec1, vec2).reshape(3,3) # Also with np.double precision.
c = a + b

等同于:

c = np.identity(3, dtype = np.double)/3.0 + np.kron(vec1, vec2).reshape(3,3)

这听起来可能很傻,但我需要非常高的数值稳定性,即引入数值错误,尽管它们很微妙,但可能会破坏程序或产生奇怪的结果。当然,这个问题可以推广到其他编程语言。

推荐哪个?有关系吗?有任何推荐的参考资料吗?

在“正常”情况下,这两种方法是等效的。

换句话说,无论您是通过显式表达式(例如 np.identity(3, dtype = np.double)/3.0)还是通过已使用该表达式初始化的 variable-name(此处为 a)来使用值),结果“通常”是相同的。

在某些 not-so-normal 情况下,它们可能会产生不同的结果。据我所知,所有这些都与 side-effects 的情况有关,因此结果取决于事情发生的顺序。例如:

考虑这样一种情况,其中 variable-name b 的初始化涉及影响 variable-name a 初始化的 side-effect。假设您的代码依赖于 side-effect。在这种情况下,对于第一种方法(您首先初始化 variable-name 然后仅使用这些变量),您的代码必须首先初始化 b,然后 a稍后——variable-names 的初始化顺序很重要。在第二种方法中(你会有显式表达式而不是 variable-names,参与更大的表达式),为了达到同样的效果,你将不得不注意 Python 解释器的顺序在表达式中计算 sub-expressions。如果您不这样做,那么 sub-expressions 的计算顺序可能不会产生您的代码所需的 side-effect,您最终可能会得到不同的结果。

至于其他编程语言,答案是肯定的,这两种方法在语言(例如Java)中会产生不同的结果,其中variable-names 关联了 data-types,这可能会导致在 variable-assignment.

期间发生一些静默数字转换(例如截断)