在python中迭代列表的最有效方法是什么?

在python中迭代列表的最有效方法是什么?,python,performance,list,Python,Performance,List,假设我有一个项目列表: x = [1, 2, 3, 4, 5] 我需要为每个项目执行一些功能。在某种情况下,我需要返回一个项目的索引 哪一种是最好和最有效的方法 for item in list: .... 或 它显然是一个函数调用较少的函数 如果您想在运行时获取项目索引,请使用以下方法 for pos, item in enumerate(collection): 检查将为循环_1提供以下字节码: 12 0 SETUP_LOOP 40 (t

假设我有一个项目列表:

x = [1, 2, 3, 4, 5]
我需要为每个项目执行一些功能。在某种情况下,我需要返回一个项目的索引

哪一种是最好和最有效的方法

for item in list:
    ....

它显然是一个函数调用较少的函数

如果您想在运行时获取项目索引,请使用以下方法

for pos, item in enumerate(collection):
检查将为循环_1提供以下字节码:

 12       0 SETUP_LOOP              40 (to 43)
          3 LOAD_GLOBAL              0 (range)
          6 LOAD_GLOBAL              1 (len)
          9 LOAD_FAST                0 (data)
         12 CALL_FUNCTION            1
         15 CALL_FUNCTION            1
         18 GET_ITER            
    >>   19 FOR_ITER                20 (to 42)
         22 STORE_FAST               1 (i)

13       25 LOAD_GLOBAL              2 (print)
         28 LOAD_FAST                0 (data)
         31 LOAD_FAST                1 (i)
         34 BINARY_SUBSCR       
         35 CALL_FUNCTION            1
         38 POP_TOP             
         39 JUMP_ABSOLUTE           19
    >>   42 POP_BLOCK           
    >>   43 LOAD_CONST               0 (None)
         46 RETURN_VALUE        
循环_2的字节码如下所示:

17        0 SETUP_LOOP              24 (to 27)
          3 LOAD_FAST                0 (data)
          6 GET_ITER            
    >>    7 FOR_ITER                16 (to 26)
         10 STORE_FAST               1 (val)

18       13 LOAD_GLOBAL              0 (print)
         16 LOAD_FAST                1 (val)
         19 CALL_FUNCTION            1
         22 POP_TOP             
         23 JUMP_ABSOLUTE            7
    >>   26 POP_BLOCK           
    >>   27 LOAD_CONST               0 (None)
         30 RETURN_VALUE

第二个版本显然更好。

显然
对于范围内的i(len(list)):
将更慢-在python 2中,它相当于:

list2 = range(len(list))

for i in list2:
    ...
如果那更快,那么这会更快,对吗

list2 = range(len(list))
list3 = range(len(list2))
list4 = range(len(list3))

for i in list4:
    ...

另一个可能的解决方案是使用
numpy
,这将非常有效,用于大型列表,可能比列表理解或for循环更有效

import numpy as np

a = np.arange(5.0)   # a --> array([0., 1., 2., 3., 4.])

# numpy operates on arrays element by element 
#
b =3.*a              # b --> array([0., 3., 6., 9., 12.])
这是一个非常简单的操作,但将数组作为公式中的参数使用可能会变得更复杂。对于大型数组,这可能比列表理解快得多,并且它使代码更干净、更易于阅读(无需创建函数来映射列表理解)。您还可以使用索引和切片来定制您想要做的事情:

如果您想访问实际的索引位置,请使用ndenumerate

# b is as above
for i, x in np.ndenumerate(b):
    print i, x
此for循环的输出为:

(0,) 0.0 
(1,) 3.0 
(2,) 6.0 
(3,) 9.0 
(4,) 12.0 

注意:numpy以元组形式返回的索引用于处理其他维度。在这里,我们只有一个维度,因此您必须解压缩元组以获取元素的索引。

请搜索论坛beofre帖子。这已经被回答了一百万次了@sulabh的可能副本:我找不到这个问题的确切副本。请链接相同的。这里我要问的问题是比较两种不同的列表迭代方式,并建议哪一种更好。如果这不是完全相同的,那么人们可以收回他们的反对票吗?你看,我是个穷人……我要提醒大家,不要误解列表是有效的容器。事实并非如此。如果您计划在大型数据集上进行迭代,则列表的效率不高。请参见下文,我们应该使用灵活度较低但可以处理大小的numpy数组。您可以添加有关此的详细信息吗?
import numpy as np

a = np.arange(5.0)   # a --> array([0., 1., 2., 3., 4.])

# numpy operates on arrays element by element 
#
b =3.*a              # b --> array([0., 3., 6., 9., 12.])
# b is as above
for i, x in np.ndenumerate(b):
    print i, x
(0,) 0.0 
(1,) 3.0 
(2,) 6.0 
(3,) 9.0 
(4,) 12.0