如果我有一个运行着数百万个项目的大型列表,我想遍历每个项目。一旦我使用了该物品,就将不再使用它,那么,一旦使用,如何从列表中删除该物品?最好的方法是什么? 我知道numpy既快速又高效,但是想知道如何使用普通列表来完成。
mylst = [item1, item2,............millions of items]
for each_item in mylist:
#use the item
#delete the item to free that memory
答案 0 :(得分:3)
您不能直接在Python中删除对象-当不再可能引用该对象时,该对象的内存将通过垃圾回收自动回收。只要对象 在列表中,以后就可以再次引用它(通过列表)。
因此,您也需要销毁该列表。例如,像这样:
while mylst:
each_item = mylst.pop() # removes an object from the end of the list
# use the item
答案 1 :(得分:0)
假设您可以复制列表(此处可能会遇到内存限制),并且只需要从中删除特定元素,则可以创建列表的浅表副本,并在遍历原始列表时从中删除元素:>
a_list = [1, 2, 3, 4, 5]
b_list = a_list.copy()
removal_key = 0
for element in a_list:
if element % 2 == 0:
b_list.pop(removal_key)
removal_key -= 1; # we need to push the removal key back afer every deletion as our array b_list becomes smaller than the original after every deletion
removal_key += 1
print(b_list) #[1, 3, 5]
如果不能创建第二个列表,则可以存储要从列表中删除的元素的键,然后使用第二个列表删除它们:
a_list = [1, 2, 3, 4, 5]
elements_to_remove = []
for key, element in enumerate(a_list):
if element % 2 == 0:
elements_to_remove.append(key)
removed_emelent_count = 0
for element in elements_to_remove:
a_list.pop(element - removed_emelent_count)
removed_emelent_count += 1
print(a_list) #[1, 3, 5]
请注意,第一种解决方案的时间效率更高(尤其是在删除大量元素时),而第二种解决方案的内存效率更高,尤其是在从列表中删除少量元素时。
答案 2 :(得分:0)
在这种情况下,您应该使用generators。
生成器是一个函数,该函数使用特殊关键字yield
而不是return
返回一个可以一次迭代一个值的对象。
通过使每个迭代仅保留一个元素,它们可以使您的内存占用空间较小。
在python3.x中,range
实际上是一个生成器(python2.x是xrange
)。
过于简单的示例:
>>> def range(start, end):
... current = start
... while current < end:
... yield current
... current += 1
...
>>> for i in range(0, 2):
... print(i)
...
0
1
这百万个条目列表是如何制作的?