哪个是在python中迭代列表的最有效方法?

man*_*007 22 python performance list

说我有一个项目列表:

x = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

我需要为每个项目执行一些功能.在某种情况下,我需要返回一个项目的索引.

哪种方式最好,效率最高?

for item in list:
    ....
Run Code Online (Sandbox Code Playgroud)

要么

for i in range(len(list)):
    ....
Run Code Online (Sandbox Code Playgroud)

Jak*_*yer 16

for item in list:
Run Code Online (Sandbox Code Playgroud)

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

如果你想获得项目的索引,当您去使用枚举这样

for pos, item in enumerate(collection):
Run Code Online (Sandbox Code Playgroud)


Mat*_*ias 15

def loop_1(data):
    for i in range(len(data)):
        print(data[i])


def looper_2(data):
    for val in data:
        print(val)
Run Code Online (Sandbox Code Playgroud)

使用dis进行检查为loop_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        
Run Code Online (Sandbox Code Playgroud)

loop_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
Run Code Online (Sandbox Code Playgroud)

第二个版本显然更好.


Pau*_*man 5

另一个可能的解决方案是使用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.])
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的操作,但是使用数组作为公式中的一个参数会变得更加复杂。对于大型数组,这可能比列表理解要快得多,并且可以使代码更整洁,更易于阅读(无需创建映射到列表理解的函数)。您还可以使用索引编制和切片来定制您要执行的操作:

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

# b is as above
for i, x in np.ndenumerate(b):
    print i, x
Run Code Online (Sandbox Code Playgroud)

此for循环的输出为:

(0,) 0.0 
(1,) 3.0 
(2,) 6.0 
(3,) 9.0 
(4,) 12.0 
Run Code Online (Sandbox Code Playgroud)

注意:索引由numpy返回为元组以处理其他尺寸。在这里,我们只有一个维度,因此您必须解开元组以获取元素的索引。