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)
第二个版本显然更好.
另一个可能的解决方案是使用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返回为元组以处理其他尺寸。在这里,我们只有一个维度,因此您必须解开元组以获取元素的索引。