附加到列表可能有两种方式:
1)
mat = []
for i in range(10):
mat.append(i)
或
2)
mat = []
for i in range(10):
mat += [i]
来自official Python documentation:
示例中显示的方法append()是为列表对象定义的;它在列表的末尾添加了一个新元素。在这个例子中,它相当于result = result + [a],但效率更高。
文档表明方法1更有效。为什么会这样?
答案 0 :(得分:9)
即使使用.append
需要方法调用,它实际上比使用扩充赋值运算符+=
稍微高效。
但是使用.append
的更好的理由是:当您要添加的列表不在本地范围内时,您可以这样做,因为它是'只是在外部作用域中调用对象的方法,而您不能对不在本地作用域中的对象执行赋值,除非您将它们声明为全局(或非本地),这种做法通常最好避免。
以下是一个例子:
mat = []
def test_append():
for i in range(10):
#mat += [i]
mat.append(i)
def test_iadd():
for i in range(10):
mat += [i]
test_append()
print(mat)
test_iadd()
print(mat)
<强>输出强>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Traceback (most recent call last):
File "./qtest.py", line 29, in <module>
test_iadd()
File "./qtest.py", line 25, in test_iadd
mat += [i]
UnboundLocalError: local variable 'mat' referenced before assignment
当然,我们可以将mat
作为参数传递给函数:
mat = []
def test_append():
for i in range(10):
#mat += [i]
mat.append(i)
def test_iadd2(mat):
for i in range(10):
mat += [i]
test_append()
print(mat)
test_iadd2(mat)
print(mat)
<强>输出强>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
test_iadd2
较慢的一个原因是它必须在每个循环上构建一个新的[i]
列表。
FWIW,这里是字节码:
test_append
21 0 SETUP_LOOP 33 (to 36)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (10)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 19 (to 35)
16 STORE_FAST 0 (i)
23 19 LOAD_GLOBAL 1 (mat)
22 LOAD_ATTR 2 (append)
25 LOAD_FAST 0 (i)
28 CALL_FUNCTION 1
31 POP_TOP
32 JUMP_ABSOLUTE 13
>> 35 POP_BLOCK
>> 36 LOAD_CONST 0 (None)
39 RETURN_VALUE
test_iadd2
26 0 SETUP_LOOP 33 (to 36)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (10)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 19 (to 35)
16 STORE_FAST 1 (i)
27 19 LOAD_FAST 0 (mat)
22 LOAD_FAST 1 (i)
25 BUILD_LIST 1
28 INPLACE_ADD
29 STORE_FAST 0 (mat)
32 JUMP_ABSOLUTE 13
>> 35 POP_BLOCK
>> 36 LOAD_CONST 0 (None)
39 RETURN_VALUE
上述字节码转储是使用dis模块生成的:
from dis import dis
mat = []
def test_append():
for i in range(10):
#mat += [i]
mat.append(i)
def test_iadd2(mat):
for i in range(10):
mat += [i]
print('test_append')
dis(test_append)
print('\ntest_iadd2')
dis(test_iadd2)
答案 1 :(得分:1)
import timeit
timeit.timeit('for i in range(10): mat.append(i)', 'mat = []')
1.798893928527832
timeit.timeit('for i in range(10): mat += [i]', 'mat = []')
2.547478199005127
方法append
更快,因为它不使用任何类型转换。
答案 2 :(得分:0)
第二个更慢,因为它创建了一个新列表(操作有点慢)。