我应该如何优化这些if/elseif分支的速度



假设我有以下python代码:

a = b = 0
if f(a) and (g(b) == 1):
    # Do Something #1
    pass
elif f(a) and (g(b) == 2):
    # Do Something #1
    pass

可以假设f()g()函数占用了一些不可忽略的CPU资源。

我想优化这段代码以提高计算效率。我应该改成下面这个吗?

a = b = 0
if f(a):
    x = g(b)
    if x == 1:
        # Do Something #1
        pass
    elif x == 2:
        # Do Something #2
        pass

有什么方法可以自动化这个优化吗?我讨厌在我的整个代码库中手工操作。

编辑:

函数f()g()是完全确定的。IE:如果给定相同的输入参数,它们总是返回相同的结果。并且它们在自己的堆栈上下文之外没有副作用。

对于f(a)使用单个if肯定更有效。为了获得最佳效率,应该将开销较大的公共子表达式的结果存储在一个变量中:

if f(a):
    gb = g(b)
    if gb == 1:
        ...
    if gb == 2:
        ...

这将尽可能少地执行这些函数


如果g(b)也可以返回与任何if不匹配的值,那么您应该配置-首先计算g(b)并看看它是否返回任何有效值,然后才计算f(a)(如果这些当然不是依赖的):

gb = g(b)
if gb in (1, 2) and f(a):
    if gb == 1:
        ...
    if gb == 2:

没有任何标准的Python编译器可以静态地优化这些,不像在C/c++中,函数内容可以内联。

最新更新