关于 Python 中 list 添加元素的操作的效率问题

2018-03-20 01:42:08 +08:00
 param

明天电脑研究一下🤔

4270 次点击
所在节点    Python
14 条回复
ericls
2018-03-20 03:04:48 +08:00
__iadd__ 是原地操作
aijam
2018-03-20 04:22:46 +08:00
“+=” is a shorthand of “ extend ”
congeec
2018-03-20 05:18:09 +08:00
m1 应该比 m2 快
fslong
2018-03-20 07:15:38 +08:00
+=。。。
noqwerty
2018-03-20 07:16:18 +08:00


我这边也是 m2 比 m1 要快。
xpresslink
2018-03-20 08:09:32 +08:00
>>> def m1(): x=[]; x.append(1)

>>> def m2(): x=[]; x+=[1]

>>> import dis
>>> dis.dis(m1)
1 0 BUILD_LIST 0
2 STORE_FAST 0 (x)
4 LOAD_FAST 0 (x)
6 LOAD_ATTR 0 (append)
8 LOAD_CONST 1 (1)
10 CALL_FUNCTION 1
12 POP_TOP
14 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> dis.dis(m2)
1 0 BUILD_LIST 0
2 STORE_FAST 0 (x)
4 LOAD_FAST 0 (x)
6 LOAD_CONST 1 (1)
8 BUILD_LIST 1
10 INPLACE_ADD
12 STORE_FAST 0 (x)
14 LOAD_CONST 0 (None)
16 RETURN_VALUE
fslong
2018-03-20 09:26:33 +08:00
如何回复截图?我这执行结果是正常的。
fslong
2018-03-20 09:34:41 +08:00
借用宝地测试下发图:
代码:
执行结果:
个人猜测,可能是由于第一种和第二张速度差不多,执行次数少的时候收到一些随机性影响导致数据不同。
Linxing
2018-03-20 09:54:57 +08:00
原来 append 最慢 我都这么➕
jyf
2018-03-20 11:14:51 +08:00
还可以考虑列表推导和.extend 这两个情况都测下

另外列表相加那个 最好看看内存
VYSE
2018-03-20 11:30:23 +08:00
X86

%timeit m1()
1000 loops, best of 3: 908 µs per loop

%timeit m2()
1000 loops, best of 3: 1.93 ms per loop
linhanqiu
2018-03-20 12:13:45 +08:00
算上空间占用的话,区别会很大,这两种方法都不算是最优的方法。
Ge4Los
2018-03-20 18:25:02 +08:00
list 默认会预留一点空间用于扩容。append 的时候如果预留空间不够,就会重新申请内存去存储。相对于 list 的长度,如果 append 了少量的元素性能会很好。
列表生成器会直接预留足够的空间,再去填充元素。
实际应用中,这种场景直接用列表生成式是没错的。
param
2018-03-23 01:56:59 +08:00
@congeec 试了好多次,m1 都不如 m2

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/439559

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX