我正在使用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
谢谢!
答案 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)]