Python:考虑性能将列表保存到文件

2 投票
3 回答
1245 浏览
提问于 2025-04-18 08:22

假设我们有一个字符串列表,这个列表大到如果我把它保存为普通的文本文件(每个元素单独一行),文件大小会达到1GB。

目前我用以下代码来保存这个列表:

savefile = codecs.open("BigList.txt", "w", "utf-8")
savefile.write("\r\n".join(BigList));
savefile.close()

当我执行到这段代码:"\r\n".join(BigList)时,我发现内存使用量急剧增加,而且保存结果的时间也很长(大约1分钟);

有没有什么建议或者技巧,可以更好地处理这个列表(减少内存使用)并更快地保存到硬盘上?

3 个回答

1

为了节省磁盘空间,你可以这样做:

from gzip impo GzipFile
with GzipFile('dump.txt', 'w') as fh:
    fh.write('\r\n'.join(BigList))

(也可以使用 with 操作符来代替)。将这个和 for 操作符结合起来,可以节省内存:

from gzip impo GzipFile
with GzipFile('dump.txt', 'w') as fh:
    for item in BigList:
        fh.write(str(item)+'\r\n')

如果你想更快地做到这一点,可以尝试这样做(可以节省内存、磁盘空间和时间):

import pickle
from gzip import GzipFile

with GzipFile('dump.pckl', 'wb') as fh:
    pickle.dump(BigList, fh)

不过要注意,你这个大列表只有在外部程序理解 Python 的 pickle 结构时才能被访问。如果你打算在自己的应用程序中重复使用这个大列表,使用 pickle 是个不错的选择。

我注意到你提到过要读取一个大文本文件,然后写入另一个文件……在这种情况下,上面的做法对你会有帮助。
如果你想在处理两个文件时节省内存或时间,可以考虑以下方法:

with open('file_one.txt', 'rb') as inp:
    with open('file_two.txt', 'wb' out:
        for line in inp:
            out.write(do_work(line)+b'\r\n')
1
for line in BigList:
    savefile.write(line+'\n')

我会通过循环来实现这个。

3

这里的 join 操作:

"\r\n".join(BigList)

是在内存中先创建了一个非常大的字符串,然后再把它写出来。如果你使用一个 for 循环的话,会更节省内存:

for line in BigList:
   savefile.write(line + "\r\n")

还有一个问题是,为什么一开始你会在内存中有这么多字符串呢?

撰写回答