如何有效地编写字符串和整数列表

时间:2014-04-16 16:59:27

标签: python list file

我有一个列表,其中包含字符串和整数列表,例如:

l = [['+1', 12, 13, 14], ['+1', 13, 14, 15]]

我需要将此列表写入一个文件,每个子列表都在一个单独的行中。

我是这样做的:

f.writelines(['%s ' % item for item in l])

工作正常。但是,我使用的列表非常大,所以这段代码运行非常。有更快的替代方案吗?

2 个答案:

答案 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')

这必须至少消耗更少的内存。