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