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

程序可以通过多次调用处理器密集型函数来轻松地浪费时间。

例如,取一个如下所示的函数:如果输入 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),但是在密钥不存在的情况下,许多情况可能需要进行更复杂的操作。