在你使用處理器密集型功能之前先看一下
程式可以通過多次呼叫處理器密集型函式來輕鬆地浪費時間。
例如,取一個如下所示的函式:如果輸入 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)
,但是在金鑰不存在的情況下,許多情況可能需要進行更復雜的操作。