完全删除python中的列表

时间:2016-08-23 15:12:56

标签: python list python-2.7 memory

我正在使用python 2,并尝试删除两个列表。 这是代码:

test_data1 = [img for img in glob.glob("/location/of/images/*png")]
test_data0 = [img for img in glob.glob("/location/of/other_images/*png")]
test_data = test_data1 + test_data0

每个图像列表都包含数百万个文件名,因此我希望在创建test_data列表后删除不必要的列表。只是为了让计算机“更容易”运行代码。

我该怎么做?

我发现了几种不同的方法,但没有任何一种方法可以用来记忆。我不确定test_data1=[]是否真正从内存中删除了列表。

我也担心test_data = test_data1 + test_data0行只会合并列表的哈希值,当我删除这两个列表时,test_data也会变空。

那么......正确的方法是什么?

真的很感谢你的帮助! 对不起,如果英语不好,我不是母语:P

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用列表并置来删除对中间列表的需求

test_data = []
test_data += [img for img in glob.glob("/location/of/images/*png")]
test_data += [img for img in glob.glob("/location/of/other_images/*png")]

此外,我不确定您的程序的整体设计是什么,但是由于这个原因,Python中首选使用迭代器/生成器而不是列表。你必须保持记忆力越少越好。看看你是否可以重新设计程序,只需动态迭代而不是构建这个大型列表。

答案 1 :(得分:1)

您可以使用extend()。这将实例化一个列表并用这些项填充它,而extend将该列表附加到test_data。这样,列表中存在的唯一内存位置将在test_data中。而不是多个实例。这是否会对性能产生任何实际影响只能通过测试/分析来确定。

test_data = []
test_data.extend([img for img in glob.glob("/location/of/images/*png")])
test_data.extend([img for img in glob.glob("/location/of/other_images/*png")])

或使用del清除该变量的绑定(垃圾收集器将删除未使用的值)。

l = [1,2,3,4,5]
del l  # l cleared from memory. 

答案 2 :(得分:0)

像在其他答案中一样向数组添加新数据的选项可行,但如果您想继续使用两个数组并添加它们,请考虑使用垃圾收集器。

Python有一个垃圾收集器,当它们不再使用时(即当对象无法访问且不再被引用时)将删除这些对象。例如,如果您有程序:

a = [1, 2, 3, 4]
a = []
#  Here data [1, 2, 3, 4] is unreachable (unreferenced)
....

垃圾收集器最终可能会删除对象[1,2,3,4]。但是你不能保证。它会自动发生,您无需对其进行任何操作。

但是,如果您担心内存资源,可以强制垃圾收集器使用gs.collect()删除未引用的对象(不要忘记import gc)。例如:

import gc

a = [1, 2, 3, 4]
a = []
gc.collect()
#  Here it is guaranteed that the memory previously occupied by [1, 2, 3, 4] is free

所以你的程序将变成

import gc

test_data1 = [img for img in glob.glob("/location/of/images/*png")]
test_data0 = [img for img in glob.glob("/location/of/other_images/*png")]
test_data = test_data1 + test_data0

test_data1 = []
test_data0 = []

gc.collect()

答案 3 :(得分:-1)

事实上,每个列表存储引用字符串,但不存在字符串本身。

我很确定,使用的内存大约是1M x 4(32位架构)或1M x 8(64位架构)。

我建议您进行分析,请参阅Which Python memory profiler is recommended?

您可以使用glob.iglob来获取迭代器而不是列表,并使用itertools.chain链接列表,如下所示:

import itertools
import glob

iter1 = glob.iglob("/location/of/images/*png")
iter2 = glob.iglob("/location/of/other_images/*png")

test_data = [name for name in itertools.chain(iter1, iter2)]