操作:保存变量然后操作与单行
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.
期间发生一些静默数字转换(例如截断)
我正在 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.
期间发生一些静默数字转换(例如截断)