为什么Extra函数调用可以加速Python中的程序?

时间:2015-09-12 00:24:01

标签: performance function python-3.3

如果我提取计算并将其放在另一个函数中则不应该 代码会慢吗?显然不是。下面,我无法相信fun2更慢 比fun1,因为fun1显然做了更多的计算。到底是怎么回事? (也许我可以有函数调用函数调用函数和真正的速度 我的代码。)

  1. 航向

    ##

    Python代码:

    MAX = 10000000  
    def fun1(): # 4.26 seconds.  
        def multiply (X, Y): # multiply two 2x2 matrices  
            a, b, c, d = X  
            e, f, g, h = Y  
            return a*e+b*g, a*f+b*h, c*e+d*g, c*f+d*h  
        X = [1,2,3,4]  
        Y = [5,6,7,8]  
        for n in range (MAX):  
            Z = multiply (X, Y)             # Make the call  
        return Z  
    #-------------------------------------------------
    def fun2(): # 6.56 seconds.  
        X = [1,2,3,4]  
        Y = [5,6,7,8]  
        for n in range (MAX):  
            Z = X[0]*Y[0] + X[1]*Y[2], \  
                X[0]*Y[1] + X[1]*Y[3], \  
                X[2]*Y[0] + X[3]*Y[2], \  
                X[2]*Y[1] + X[3]*Y[3]  # Don't make the call.  
        return Z 
    

2 个答案:

答案 0 :(得分:0)

我不确定,但我认为可能是那个

a,b,c,d = X

然后直接引用a,b,c和d比引用X [0](等等)更快。

列表中的每个索引都是另一个查找,而a,b,c,d = X只是一次查找(我认为)。

答案 1 :(得分:0)

我终于找到了自己的问题。该功能省去了方括号,这是速度增加的来源,而不是来自函数调用本身。 Python列表包含值和位大小(或地址,我不知道哪个)。要访问x [3],计算机转到地址x读取地址x [1],移动到那里,读取地址x [2],移动到那里,读取地址x [3],移动到那里,最后访问该值。这需要时间,并且可以通过将列表元素分配给简单标识符来加速。