明天电脑研究一下🤔
1
ericls 2018-03-20 03:04:48 +08:00 via iPhone
__iadd__ 是原地操作
|
2
aijam 2018-03-20 04:22:46 +08:00 via iPhone
“+=” is a shorthand of “ extend ”
|
3
congeec 2018-03-20 05:18:09 +08:00
m1 应该比 m2 快
|
4
fslong 2018-03-20 07:15:38 +08:00 via Android
+=。。。
|
5
noqwerty 2018-03-20 07:16:18 +08:00
我这边也是 m2 比 m1 要快。 |
6
xpresslink 2018-03-20 08:09:32 +08:00 1
>>> 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 |
7
fslong 2018-03-20 09:26:33 +08:00
如何回复截图?我这执行结果是正常的。
|
8
fslong 2018-03-20 09:34:41 +08:00
借用宝地测试下发图:
代码: 执行结果: 个人猜测,可能是由于第一种和第二张速度差不多,执行次数少的时候收到一些随机性影响导致数据不同。 |
9
Linxing 2018-03-20 09:54:57 +08:00 via iPhone
原来 append 最慢 我都这么➕
|
10
jyf 2018-03-20 11:14:51 +08:00
还可以考虑列表推导和.extend 这两个情况都测下
另外列表相加那个 最好看看内存 |
11
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 |
12
linhanqiu 2018-03-20 12:13:45 +08:00
算上空间占用的话,区别会很大,这两种方法都不算是最优的方法。
|
13
Ge4Los 2018-03-20 18:25:02 +08:00 1
list 默认会预留一点空间用于扩容。append 的时候如果预留空间不够,就会重新申请内存去存储。相对于 list 的长度,如果 append 了少量的元素性能会很好。
列表生成器会直接预留足够的空间,再去填充元素。 实际应用中,这种场景直接用列表生成式是没错的。 |