在你使用處理器密集型功能之前先看一下

程式可以通過多次呼叫處理器密集型函式來輕鬆地浪費時間。

例如,取一個如下所示的函式:如果輸入 value 可以生成一個整數,則返回一個整數,否則 None

def intensive_f(value): # int -> Optional[int]
   # complex, and time-consuming code
   if process_has_failed:
       return None
   return integer_output

它可以通過以下方式使用:

x = 5
if intensive_f(x) is not None:
    print(intensive_f(x) / 2)
else:
    print(x, "could not be processed")

print(x)

雖然這會起作用,但它有呼叫 intensive_f 的問題,這會使程式碼執行的時間加倍。更好的解決方案是事先獲得函式的返回值。

x = 5
result = intensive_f(x)
if result is not None:
    print(result / 2)
else:
    print(x, "could not be processed")

但是,更清晰且可能更加 pythonic 的方法是使用異常,例如:

x = 5
try:
    print(intensive_f(x) / 2)
except TypeError: # The exception raised if None + 1 is attempted
    print(x, "could not be processed")

這裡不需要臨時變數。通常最好使用 assert 語句,而不是捕捉 AssertionError

字典鍵

可以找到它的常見示例是訪問字典鍵。例如比較:

bird_speeds = get_very_long_dictionary()

if "european swallow" in bird_speeds:
    speed = bird_speeds["european swallow"]
else:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

有:

bird_speeds = get_very_long_dictionary()

try:
    speed = bird_speeds["european swallow"]
except KeyError:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

第一個例子必須翻閱字典兩次,因為這是一個長字典,每次都可能需要很長時間。第二個只需要通過字典進行一次搜尋,從而節省了大量的處理器時間。

另一種方法是使用 dict.get(key, default),但是在金鑰不存在的情況下,許多情況可能需要進行更復雜的操作。