簡體   English   中英

操作:保存變量然后操作 vs 單行

[英]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 )還是通過已使用該表達式初始化的變量名(此處為a )使用值,結果“通常”是一樣的。

有一些不太正常的情況,它們可能會產生不同的結果。 據我所知,所有這些都與存在副作用的情況有關,因此結果取決於事情發生的順序。 例如:

考慮一個場景,其中變量名b的初始化涉及影響變量名a初始化的副作用。 假設您的代碼取決於該副作用。 在這種情況下,在拳頭的方法(在這里你首先初始化變量,名稱,然后只使用這些變量)的情況下,你的代碼必須初始化b第一,和a后-變量的初始化順序-名字很重要。 在第二種方法中(您將使用顯式表達式而不是變量名,參與更大的表達式),要達到相同的效果,您必須注意 Python 解釋器在表達式中計算子表達式的順序. 如果不這樣做,則子表達式的計算順序可能不會產生您的代碼所需的副作用,並且您最終可能會得到不同的結果。

至於其他編程語言,答案是肯定的,這兩種方法可以產生不同的結果,在語言(例如 Java)中,變量名具有關聯的數據類型,這可能會導致一些無聲的數字轉換(例如截斷) 在變量賦值期間發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM