在python中完全删除列表
我正在使用python 2,并试图删除两个列表。 代码如下:在python中完全删除列表,python,list,python-2.7,memory,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 = [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\u data1=[]
是否真的从内存中完全删除了列表
另外,我担心test\u data=test\u data1+test\u data0
行只合并了列表的散列,当我删除这两个列表时,test\u data
也会变为空
所以。。正确的方法是什么
非常感谢你的帮助!
对不起,如果英语不好,我不是以英语为母语的人
谢谢 您可以使用列表连接来消除对中间列表的需要
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中有一种偏好,就是出于这个原因,使用迭代器/生成器而不是列表。你一次记住的东西越少越好。看看你是否可以重新设计你的程序,让它在运行中迭代,而不是建立一个庞大的列表。你可以使用。这将实例化一个列表并用这些项目填充它,extend将把该列表附加到test\u data
中。这样,列表在内存中的唯一位置将位于test\u 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")])
或者使用,清除该变量的绑定(垃圾收集器将删除未使用的值)
在其他答案中添加新数据到数组的选项是有效的,但是如果要保持两个数组并添加它们,请考虑使用垃圾回收器。 Python有一个垃圾收集器,当对象不再使用时(即当对象不可访问且不再被引用时),它将删除对象。例如,如果您有该程序:
a = [1, 2, 3, 4]
a = []
# Here data [1, 2, 3, 4] is unreachable (unreferenced)
....
垃圾收集器最终可能会删除对象[1、2、3、4]。不过,你不能保证什么时候能成功。它会自动发生,你不必对它做任何事情
但是,如果您担心内存资源,可以使用gs.collect()
(不要忘记导入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()
事实上,每个列表存储都引用字符串,而不是字符串本身 我很确定,使用的内存大约是1Mx4(对于32位体系结构)或1Mx8(对于64位体系结构) 我建议你做分析,看 您可以使用迭代器代替列表,并将列表与链接,如下所示:
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)]
特别是,在这个特定的例子中,可能会被证明是有用的。你说“删除对中间列表的需要”,但你仍然在这样做,创建中间列表。这不像
[glob.glob中img的img(“/location/of/images/*png”)]
不是一个列表。就内存使用而言,删除某些内容与原始代码没有任何区别,只需使用del
关键字查看类似del test\u data0
。此外,如果删除2个原始列表(例如tset_数据0
和test_数据1
),则最后一个列表(test_数据
)将保持不变,因为它是一个新列表
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)]