2016-11-19 107 views
1

我想了解为什么我得到我以不同的方式编写功能时看到的速度差异。 我最感兴趣的是理解为什么情况(1)比情况(2)快。蟒蛇的速度组成功能

谢谢!

import math 
from time import time 

def f(x): 
    return 2*x 
def g(x): 
    return x*x 
def h(x): 
    return math.sqrt(x) 

time0 = time() 
for x in range(1,10**7): 
    x_ = h(g(f(x))) 
print 'h(g(f(x))): {}'.format(time() - time0) 

def fgh(x): 
    return h(g(f(x))) 
time0 = time() 
for x in range(1,10**7): 
    x_ = fgh(x) 
print 'composed: {}'.format(time() - time0) 

time0 = time() 
for x in range(1,10**7): 
    x_ = f(x) 
    x__ = g(x_) 
    x___ = h(x__) 
print 'subsequent: {}'.format(time() - time0) 

由于运行时,我得到:

h(g(f(x))): 2.83475399017 
composed: 3.29999113083 
subsequent: 3.4387819767 

回答

1

对于初学者来说,情况2有一个额外的调用 - 即fgh(x),而在情况1你直接调用h(g(f(x)))。在执行很多次的紧密循环中,额外的函数调用可以增加额外的执行时间。情况1内线呼叫,所以它快一点。情况3正在做一些额外的分配和加载变量,这解释了为什么它变慢。

+0

好吧,我以为是这样的。公平地说,如果每个组合函数都更加复杂和耗时,那么对于运行时我怎样编写它们并不重要? (即例2中的附加函数调用变得可以忽略) – Aplln

+0

对于一般情况,它取决于函数 - 可能存在组合顺序_does_问题的情况(例如:当组成大矩阵的乘法时)。对于你的例子来说,这可能并不重要,但可以假定像大数字这样的平方根操作会比较慢,所以如果我们把它留到最后,它会稍微慢一些 –