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



我有一个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)

尝试计时:

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)

这是最快的版本。

最新更新