Python代码通过将常用列表元素存储在局部变量中来加速

时间:2014-12-22 16:40:58

标签: performance list python-3.x indexing

我有一个Python代码,其中我有一个列表,其中一些元素被引用并在一个运行多次的循环中使用。以下是我所谈论的一个例子:

for n in range(0, 1000000):
    a = my_list[n] * 2
    b = my_list[n] + my_list[n+1]
    c = my_list[n] * my_list[n+1]
    d = my_list[n] - my_list[n+1]
    my_function(a, b, c, d)

my_list[n]my_list[n+1]存储在两个变量中然后将它们用作以下内容会更快吗?

for n in range(0, 1000000):
    my_list_n = my_list[n]
    my_list_np1 = my_list[n+1]        
    a = my_list_n  * 2
    b = my_list_n  + my_list_np1
    c = my_list_n  * my_list_np1
    d = my_list_n  - my_list_np1
    my_function(a, b, c, d)

1 个答案:

答案 0 :(得分:1)

尝试计时:

from __future__ import print_function

def my_function(a, b, c, d):
    e=a*b*c*d

def f1():
    for n in range(0, 1000000):
        a = my_list[n] * 2
        b = my_list[n] + my_list[n+1]
        c = my_list[n] * my_list[n+1]
        d = my_list[n] - my_list[n+1]
        my_function(a, b, c, d)

def f2():    
    for n in range(0, 1000000):
        my_list_n = my_list[n]
        my_list_np1 = my_list[n+1]        
        a = my_list_n  * 2
        b = my_list_n  + my_list_np1
        c = my_list_n  * my_list_np1
        d = my_list_n  - my_list_np1
        my_function(a, b, c, d)    


def f3():
    for n in range(0, 1000000):       
        my_function(my_list[n] * 2,
                    my_list[n] + my_list[n+1],
                    my_list[n] * my_list[n+1],
                    my_list[n] - my_list[n+1])

if __name__ == '__main__':
    import timeit       
    import sys
    print(sys.version)             
    my_list=range(1000001)
    n=2
    for f in (f1, f2, f3):
        res=timeit.timeit("{}()".format(f.__name__), setup="from __main__ import {}, my_list".format(f.__name__), number=n)
        print("{}: {:.3} secs".format(f.__name__, res))     

各种python版本的结果:

2.7.7 (default, Jun 14 2014, 23:12:13) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
f1: 2.27 secs
f2: 1.77 secs
f3: 2.07 secs

3.4.1 (default, May 19 2014, 13:10:29) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
f1: 4.14 secs
f2: 2.41 secs
f3: 4.16 secs

2.7.6 (32f35069a16d, Jun 06 2014, 20:12:47)
[PyPy 2.3.1 with GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]
f1: 0.257 secs
f2: 0.241 secs
f3: 0.241 secs

3.2.5 (986752d005bb+, Jun 19 2014, 19:20:06)
[PyPy 2.3.1 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)]
f1: 0.267 secs
f2: 0.263 secs
f3: 0.269 secs

总的来说,是的 - 它更快。多少取决于版本。

快速观察一下这是一个很好的枚举应用程序:

def f4():
    for n, e in enumerate(my_list[0:1000000]):  
        np1 = my_list[n+1]      
        my_function(e * 2,
                    e + np1,
                    e * np1,
                    e - np1)

这是所有版本中最快的版本。