在这篇文章中,我试图解释列表的工作方式以及为什么 append 不是很昂贵。我还在底部发布了一个解决方案,您可以使用它来删除行。
Python 列表的结构就像一个节点网络:
>>> class ListItem:
def __init__(self, value, next=None):
self.value = value
self.next = next
def __repr__(self):
return "Item: %s"%self.value
>>> ListItem("a", ListItem("b", ListItem("c")))
Item: a
>>> mylist = ListItem("a", ListItem("b", ListItem("c")))
>>> mylist.next.next
Item: c
因此, append 基本上就是这样:
ListItem(mynewvalue, oldlistitem)
Append 没有太多开销,但insert()
另一方面需要您重建整个列表,因此会花费更多时间。
>>> from timeit import timeit
>>> timeit('a=[]\nfor i in range(100): a.append(i)', number=1000)
0.03651859015577941
>>> timeit('a=[]\nfor i in range(100): a.insert(0, i)', number=1000)
0.047090002177625934
>>> timeit('a=[]\nfor i in range(100): a.append(i)', number=10000)
0.18015429656996673
>>> timeit('a=[]\nfor i in range(100): a.insert(0, i)', number=10000)
0.35550057300308424
如您所见,插入要慢得多。如果我是你,我会删除你不需要的行,马上写回去。
with open("large.txt", "r") as fin:
with open("large.txt", "w") as f:
for line in fin:
if myfancyconditionismet:
# write the line to the file again
f.write(line + "\n")
# otherwise it is gone
有我的解释和解决方案。
-Sunjay03