在python中有效读取数据(只有一行)

时间:2014-10-01 10:32:31

标签: python string python-3.x io

对于即将举行的编程比赛,我解决了之前比赛的一些任务。 每个任务看起来像这样:我们得到一堆文件(每个包含1行数字和字符串,fe" 2 15 test 23 ..."),我们必须构建一个程序,返回一些计算值。

这些文件内容可能非常大:例如10 MB。 我的代码如下:

with open(filename) as f:
    input_data = f.read().split()

这很慢。我认为主要是因为分裂方法。有更快的方法吗?

2 个答案:

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

这有一些优点:

  • 您不需要将整个文件读入内存(在桌面上为10 MB,可能并不重要)
  • 如果您对每组令牌进行大量处理,可能可以带来更好的性能,因为您将拥有交替的I / O和CPU绑定任务。现代操作系统使用顺序文件预取来优化文件线性访问,因此,实际上,如果锁定I / O和CPU,您的I / O最终将由操作系统并行执行。即使您的操作系统没有这样的功能,如果您有一个现代磁盘,它可能会缓存对块的顺序访问。

但是,如果你没有多少处理,你的任务基本上是I / O限制的,你可以做很多事情来加快它的速度,正如wim所说 - 除了重新考虑您的输入数据格式