以python高效读取数据(仅一行)

以python高效读取数据(仅一行),python,string,python-3.x,io,Python,String,Python 3.x,Io,在即将到来的编程竞赛中,我解决了以前竞赛中的一些任务。 每个任务都是这样的:我们得到一堆in文件(每个文件包含一行数字和字符串,例如“215test23…”),我们必须构建一个程序并返回一些计算值 这些文件可能相当大:例如10MB。 我的代码如下: with open(filename) as f: input_data = f.read().split() 这相当慢。我提问主要是因为分裂法。有没有更快的方法?对于单行文件上的纯文本IO,您已经找到的方法看起来是最好的方法 10 MB

在即将到来的编程竞赛中,我解决了以前竞赛中的一些任务。 每个任务都是这样的:我们得到一堆in文件(每个文件包含一行数字和字符串,例如“215test23…”),我们必须构建一个程序并返回一些计算值

这些文件可能相当大:例如10MB。 我的代码如下:

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

这相当慢。我提问主要是因为分裂法。有没有更快的方法?

对于单行文件上的纯文本IO,您已经找到的方法看起来是最好的方法


10 MB的纯文本是相当大的,如果你需要更多的加速,你可以考虑用二进制格式来替代数据,而不是纯文本格式。或者,如果它是非常重复的数据,您可以将其压缩存储

如果您的一个输入文件包含独立的任务(也就是说,您可以一次处理一行中的两个令牌,而不需要知道前面的令牌),您可以通过simpy不立即读取整个文件来执行lockstep读取和处理

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
这有一些好处:

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

但是,如果您没有太多的处理,那么您的任务基本上是受I/O限制的,并且正如wim所说,您无法做太多事情来加速它,除了重新考虑输入数据格式之外,您可以使用
readline()
读取第一行,如果它是大数据,并且您知道它的大小,那么不必分割整行,只需使用
buffer=f.readline()[:number\u of_bytes]
,您还可以读取特定数量的字节,如
f.read(number\u of_bytes)
您不能在中分配给
,这是一种语法error@KobiK这是一条单行线file@wim这只是一个示例,将其更正为另一个变量名是否需要使用文件中的所有数据来计算所需的值?如果没有,您如何找到所需的数据?如果您只需要使用部分数据,并且所需数据位于(或之后)已知偏移量,则可以通过使用
seek()
+1大大加快速度-我可以想出更节省内存的方法,但我想不出任何“更快”的方法。…@joaquin您是对的,我错过了。不过,该技术对于任何可分离的数据块都是有效的——我对问题进行了编辑,以便更好地解释它