迭代与列表串联

发布于 2021-01-29 14:58:24

因此,有两种获取列表并将第二个列表的成员添加到第一个列表的方法。您可以使用列表串联,也可以对其进行迭代。您可以:

for obj in list2:
    list1.append(obj)

或者您可以:

list1 = list1 + list2

要么

list1 += list2

我的问题是:哪个更快,为什么?我使用两个极大的列表(最多10000个对象)进行了测试,似乎迭代方法比列表串联快得多(如l1 = l1 +
l2)。为什么是这样?有人可以解释吗?

关注者
0
被浏览
113
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    append一次添加每个项目,这是导致它变慢的原因,以及对的重复调用append

    但是, 在这种情况下,+=运算符 不是。的
    语法糖+。该+=运营商实际上并没有建立一个新的列表,然后分配给它回来了,它改变了左手操作到位。当timeit同时使用10,000次时,这很明显。

    >>> timeit.timeit(stmt="l = l + j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
    0.5794978141784668
    >>> timeit.timeit(stmt="l += j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
    0.0013298988342285156
    

    += 快得多(约500倍)

    您还具有extend列表方法,该方法可以将任何可迭代的内容(不只是另一个列表)附加到类似l.extend(l2)

    >>> timeit.timeit(stmt="l.extend(j)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
    0.0016009807586669922
    >>> timeit.timeit(stmt="for e in j: l.append(e)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
    0.00805807113647461
    

    从逻辑上讲等同于追加,但是您可以看到快得多。

    所以要解释一下:迭代比+ 因为+必须构造一个完整的新列表要快

    extend比迭代更快,因为它是内置列表方法,并且已经过优化。从逻辑上讲,它等同于重复添加,但实现方式有所不同。

    +=它比extend可以在适当位置修改列表,知道列表必须大得多且无需重复调用函数的速度快。假定您要在列表中附加另一个列表/元组



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看