通过索引删除列表元素比通过值删除它更有效吗?

Ben*_*ler 0 python performance runtime python-internals

在python中,假设我们有以下列表: my_list = ['a', 'b', 'c', 'd', ...]

my_list.pop(3)比效率更高my_list.remove('d')吗?

Fal*_*lko 8

根据这个答案,这两种方法的复杂性是:

pop     O(n - i)
remove  O(n)
Run Code Online (Sandbox Code Playgroud)

使用列表长度n和元素索引i.

因此,根据列表的大小,从长远来看pop 可能会更快.

  • 但实际上,我怀疑您会否以任何'n'的日常值来击败常数项。 (2认同)

Wan*_*uta 6

对于小型列表来说并不重要:

[wander@box ~]$ python -m timeit '[1, 2, 3].pop(1)'
10000000 loops, best of 3: 0.167 usec per loop
[wander@box ~]$ python -m timeit '[1, 2, 3].remove(2)'
10000000 loops, best of 3: 0.129 usec per loop
Run Code Online (Sandbox Code Playgroud)

如果您的列表非常大,或者比较列表中的元素需要很长时间,那么可能会有更多不同之处.删除速度会慢,因为它必须通过(并比较)所有元素:

[wander@box ~]$ python -m timeit -n 100000 'list(range(1, 100)).pop(98)'
100000 loops, best of 3: 0.916 usec per loop
[wander@box ~]$ python -m timeit -n 100000 'list(range(1, 100)).remove(98)'
100000 loops, best of 3: 2.05 usec per loop
Run Code Online (Sandbox Code Playgroud)

这是整数,比较快.如果列表中的元素有更多有趣的__eq__方法,remove可能需要很长时间:

class Foo:
    def __eq__(self, other):
        time.sleep(1)
        return False

[Foo(), Foo(), Foo(), Foo(), 20].remove(20)
Run Code Online (Sandbox Code Playgroud)

所以,如果你知道索引,那就去吧pop.