对于即将举行的编程比赛,我解决了之前比赛的一些任务。 每个任务看起来像这样:我们得到一堆文件(每个包含1行数字和字符串,fe" 2 15 test 23 ..."),我们必须构建一个程序,返回一些计算值。
这些文件内容可能非常大:例如10 MB。 我的代码如下:
with open(filename) as f:
input_data = f.read().split()
这很慢。我认为主要是因为分裂方法。有更快的方法吗?
答案 0 :(得分:1)
您已经看起来像是单行文件上纯文本IO的最佳方式。
10 MB的纯文本相当大,如果你需要更多的加速,你可以考虑以二进制格式而不是纯文本格式来搜索数据。或者,如果它是非常重复的数据,您可以将其存储为压缩。
答案 1 :(得分:1)
如果您的某个输入文件包含独立任务(也就是说,您可以一次处理该行的几个令牌,而无需进一步了解令牌),则可以通过简单的方式进行读取和处理。一次读完整个文件。
def read_groups(f):
chunksize= 4096 #how many bytes to read from the file at once
buf= f.read(chunksize)
while buf:
if entire_group_inside(buf): #checks if you have enough data to process on buf
i= next_group_index(buf) #returns the index on the next group of tokens
group, buf= buf[:i], buf[i:]
yield group
else:
buf+= f.read(chunksize)
with open(filename) as f:
for data in read_groups(f):
#do something
这有一些优点:
但是,如果你没有多少处理,你的任务基本上是I / O限制的,你可以做很多事情来加快它的速度,正如wim所说 - 除了重新考虑您的输入数据格式