Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Python代码通过在局部变量中存储常用的列表元素来加速_Performance_List_Python 3.x_Indexing - Fatal编程技术网

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

Performance Python代码通过在局部变量中存储常用的列表元素来加速,performance,list,python-3.x,indexing,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

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

哪一个是最快的版本。

您试过了吗?这应该很容易测试。我想它可能会更快,但可能不是很明显……而且,这一点点的加速是否重要很大程度上取决于
my_function()
的功能。将一个耗时数小时的整个流程缩短1秒并不是一个特别显著的改进…@twalberg:这一点很好。同意。可读性很重要,同时也需要权衡性能的微小改进。谢谢@dawg。我感谢你的帮助。非常有趣的结果。我发现,当使用
PyPy
而不是
GCC
时,速度几乎快了一个数量级。因为我是这方面的初学者,你能告诉我这些是什么吗?@dawg我能在当前安装Python 3.4.1的同时安装它吗?它是一个完全不同的程序,还是会引起问题,我需要保留其中一个?是的,它可以是一个不同的程序,您可以逐个脚本使用最适合您需要的程序。