我有一个列表,其中包含字符串和整数列表,例如:
l = [['+1', 12, 13, 14], ['+1', 13, 14, 15]]
我需要将此列表写入一个文件,每个子列表都在一个单独的行中。
我是这样做的:
f.writelines(['%s ' % item for item in l])
工作正常。但是,我使用的列表非常大,所以这段代码运行非常。有更快的替代方案吗?
答案 0 :(得分:4)
你是否已经尝试过在不通过每个元素“子循环”的情况下编写行?
for i in l:
f.write("%s %d %d %d\n" % tuple(i))
最大限度地减少独立write
事件的数量将为您提供最佳的速度提升。
如果您的文件足够小以适合内存,您可以在循环中构建输出字符串,然后只使用一个write
操作来输出它。
(注意,请参阅下面的生成输出字符串的时间测试)
为整个文件创建一个输出字符串的快速方法(假设您不希望[]
- 如果您这样做,则将它们添加到字符串中):
outstring = "\n".join(["%s %d %d %d" % tuple(i) for i in l])
f.write(outstring)
如果它太大,你可以按块建立字符串块(例如,一次10000个项目)并批量写入。
最后,这几乎看起来像json
格式,所以如果你想创建一个json
文件,你可以这样做:
import json
json.dumps(l)
编辑:您根本不需要json
,只需使用str(mylist)
即可...请参阅下面的实施。
后来:
我在生成输出字符串时做了一些时间。
outstr = str(mylist)[1:-1].replace("], ","]\n").replace(",","")
比以下快三倍:
outstr = "\n".join(["%s %d %d %d" % tuple(i) for i in mylist])
答案 1 :(得分:2)
当你使用这样的列表理解时:
["%s " % item for item in l]
Python创建了一个generator。因此,l
中的项目数量(正如您所说)不是问题。但是,几乎总是,更好的性能伴随着更多的代码。
我的观点:使用生成器打印行的每个元素。这样你就不必将整个列表加载到内存中。
试试这个:
l = [['+1', 12, 13, 14], ['+1', 13, 14, 15]]
f = open("your_file.txt", 'w')
for item in l:
f.write('[')
for elem in item[:-1]:
f.write("{}, ".format(elem))
f.write("{}".format(item[-1]))
f.write(']\n')
这必须至少消耗更少的内存。