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

时间:2015-09-16 19:17:34

标签: python optimization

假设我有以下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:如果给出相同的输入参数,它们总是返回相同的结果。并且它们在自己的堆栈环境之外没有任何副作用。

1 个答案:

答案 0 :(得分:4)

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 ++不同,在C / C ++中可以内联函数内容。