在你使用处理器密集型功能之前先看一下
程序可以通过多次调用处理器密集型函数来轻松地浪费时间。
例如,取一个如下所示的函数:如果输入 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)
,但是在密钥不存在的情况下,许多情况可能需要进行更复杂的操作。