假设我有一个 list
TruncList
,其中的元素数量大于 n
。如果我想从该列表的末尾删除 n
元素,将 重新定义为自身的一个切片 保留所需元素(如通过 TruncList = TruncList[:-n]
)或 从列表中删除不需要的元素 的切片是否更快,如 del TruncList[-n:]
?
如果我从 n
中删除第一个 TruncList
元素,答案是否会改变,如 TruncList = TruncList[n:]
与 del TruncList[:n]
?
除了速度之外,这些方法中的一种是否比另一种更 Pythonic?
我想重新定义方法可能会更慢,因为它遍历 TruncList
然后重新分配它,而 del
将列表截断到位,但我不确定这是否是其中任何一个。
我还认为 del
是更好的路线,因为它似乎是该函数的自然使用。
最佳答案
这将完全取决于您删除了多少元素。
在 CPython 中,list
类型使用动态过度分配策略来避免过于频繁地调整底层 C 数组的大小。有一个 array
来保存元素,并且始终保持稍微过大。
然后删除(使用 del TruncList[-n:]
) 可能 是一个几乎免费的操作,前提是 n
足够小。事实上,在调整大小之前,您可以安全地删除最多 一半 过度分配数组的大小。调整大小需要将所有现有引用复制到新数组。
使用切片总是会创建新的列表对象,需要分配内存并复制涉及的元素。这比重新分配数据稍微多一些。
因此,如果不测量时间性能(使用 timeit
),我希望 del
选项比切片更快;对于 n < len(TruncList) // 2
(小于长度的一半),在许多情况下,您甚至不需要调整大小,即使您这样做了,由于只需要重新创建内部数组,因此需要完成的工作会稍微少一些。
当您从前面删除项目时,您将始终必须重新创建内部数组。那时差异不会很明显,但是创建切片仍然会导致分配给一个全新的对象。
关于python - 通过使其等于切片或使用 del 来截断列表是否更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29193127/