【问题标题】:Is there a reason why append and insert are both there?append 和 insert 都存在有什么原因吗?
【发布时间】:2015-07-31 04:26:07
【问题描述】:

我肯定不是我想成为的 Python 大师,而且我主要在业余时间学习学习/实验,我很可能会为有经验的用户提出一个微不足道的问题......然而,我真的很想了解,这是一个对我有很大帮助的地方。

现在,在适当的前提下,Python 文档说:

4.6.3。可变序列类型

s.append(x) 将 x 附加到序列的末尾(与 s[len(s):len(s)] = [x])

[...]

s.insert(i, x) 在 i 给定的索引处将 x 插入到 s 中(与 s[i:i] = [x])

此外:

5.1。更多关于列表

list.append(x) 将一个项目添加到列表的末尾。相当于 a[len(a):] = [x].

[...]

list.insert(i, x) 在给定位置插入一个项目。首先 参数是要插入的元素的索引,所以 a.insert(0, x) 在列表的前面插入,a.insert(len(a), x) 等价于 a.append(x)

所以现在我想知道为什么有两种方法可以做,基本上是同一件事?难道只有一个append/insert(x, i=len(this)) 是可能的(并且更简单),其中i 是一个可选参数,如果不存在,则意味着添加到列表的末尾?

【问题讨论】:

  • append 只能插入到末尾。它是insert 的特例。
  • append 需要恒定时间来运行,insert 也需要线性时间来运行;请参阅 Python Wiki 上的 TimeComplexity。 (线性时间,或O(n),表示insert一个值所花费的时间随着列表的大小而变化,而append总是很快。)
  • 只有一种方法会是一个更简单的 API,但与在中间或前面插入相比,附加到列表通常具有不同的性能特征,请参阅 stackoverflow.com/questions/7776938/python-insert-vs-append。你可以选择只使用插入而不用附加。
  • @thefourtheye :是的,我明白……那为什么不简单地使用insert 将索引参数设为可选呢?
  • @Mauris 这将是一个很好的答案。

标签: python insert append


【解决方案1】:

此处追加和插入的区别与正常用法和大多数文本编辑器中的区别相同。 Append 添加到 列表的末尾,而 insert 添加 在指定索引的前面。它们是不同方法的原因既是因为它们做的事情不同,而且因为 append 可以预期是一个快速操作,而 insert 可能需要一段时间,具体取决于列表的大小和您要插入的位置,因为插入点之后的所有内容都必须重新索引。

我不知道insertappend 采用不同方法的实际原因,但我会做出有根据的猜测,这是为了帮助提醒开发人员注意固有的性能差异。而不是一个 insert 方法,带有一个可选参数,通常会在线性时间运行,除非没有指定参数,在这种情况下它将在恒定时间运行(非常奇怪),第二种方法将 添加了总是恒定的时间。这种类型的设计决策可以在 Python 的其他地方看到,例如当像 list.sort 这样的方法返回 None 而不是新列表时,提醒它们是就地操作,而不是创建(并返回)新列表。

【讨论】:

    【解决方案2】:

    另一个答案很好——但另一个根本区别是insert 要慢得多

    $ python -m timeit -s 'x=list(range(100000))' 'x.append(1)'
    10000000 loops, best of 3: 0.19 usec per loop
    $ python -m timeit -s 'x=list(range(100000))' 'x.insert(len(x), 1)'
    1000000 loops, best of 3: 0.514 usec per loop
    

    它是 O(n),这意味着在 len(x)insert 所花费的时间与列表的大小成线性关系。 appendO(1),这意味着无论您的列表有多大,它总是非常快。

    【讨论】:

    • 我确实尝试在我的回答中谈到这一点,但这更深入,我喜欢你的例子。您应该添加这种情况:python -m timeit -s 'x=list(range(100000))' 'x.insert(0, 1)'。当我运行这个时,我得到了与你相似的结果,最后插入的速度大约是附加的两倍。对于在开头插入,这是它真正最坏的情况,它慢了 160 倍。我意识到这有点像苹果对橙子,因为这不是 append 可以就地做的事情,但它确实有助于突出插入实际上变慢的地方。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多