對于以下兩個代碼:
if a and b:
then do something
if a:
if b:
then do something
這兩個陳述句在語意和執行時間方面有什么區別?他們倆的評價不總是一樣的嗎?并且其中一個比另一個快(我不是漸近地問,不是大 O 符號)?
帶有和的位元組碼:
7 0 LOAD_GLOBAL 0 (a)
2 POP_JUMP_IF_FALSE 8
4 LOAD_GLOBAL 1 (b)
6 POP_JUMP_IF_FALSE 8
8 >> 8 LOAD_CONST 0 (None)
10 RETURN_VALUE
嵌套陳述句:
10 0 LOAD_GLOBAL 0 (a)
2 POP_JUMP_IF_FALSE 8
11 4 LOAD_GLOBAL 1 (b)
6 POP_JUMP_IF_FALSE 8
12 >> 8 LOAD_CONST 0 (None)
10 RETURN_VALUE
編輯: 如果我沒有犯錯,他們會生成完全相同的位元組碼。
uj5u.com熱心網友回復:
它們具有完全相同的語意。
見6.11。語言規范中的布爾運算:
運算式 x 和 y 首先計算 x;如果 x 為假,則回傳其值;否則,評估 y 并回傳結果值。
和8.1。if宣告:_
它通過逐一評估運算式直到發現其中一個為真(有關真偽的定義,請參見布爾運算部分)來精確選擇其中一個套件;然后執行該套件(并且不執行或評估 if 陳述句的其他部分)。
__bool__和__and__(它是運算子&,不是)方法的實作的任何棘手組合都不and能改變這一點。
我不會擔心任何性能差異;如果您需要擔心此類納米優化,請不要首先使用 Python。
uj5u.com熱心網友回復:
當你寫代碼時,你應該先看看你以后可以理解代碼。所以我會選擇第一種型別的 if 陳述句。我認為,您將在功能相當強大的 PC 上執行此代碼,您根本不會注意到任何速度差異。
看看,代碼是干凈和可讀的,以確保你不會做額外的冗長復雜的邏輯。糟糕的邏輯實作方式將需要更長的時間來執行。
uj5u.com熱心網友回復:
語意完全相同。它們是如何被解釋的,特別是解釋的速度取決于特定的解釋器/編譯器(即依賴于 python 發行版)。
附帶說明一下,如果您對漸近復雜性不感興趣,那么您已經有了答案:它們在可感知的時間內運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482608.html
上一篇:如何在R中具有字母數字范圍的多列中使用ifelse來創建新列?
下一篇:無法弄清楚這個分段錯誤
