使用范围功能读取文件

时间:2019-01-28 12:13:06

标签: python performance file for-loop range

我正在读取像这样的大块文件

Y

如果我使用长度变量而不是len(data),则类似

>  def gen_data(data):
>             for i in range(0, len(data), chunk_sz):
>                 yield data[i: i + chunk_sz]

大文件的性能改进将是什么?我测试了一个小的,但没有发现任何变化。

P.S我来自C / C ++背景,在while或for循环中进行每次重复计算都是不好的做法,因为它会针对每次调用执行。

2 个答案:

答案 0 :(得分:0)

使用此代码将大文件读取为大块:

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


f = open('really_big_file.dat')
for piece in read_in_chunks(f):
    process_data(piece)

另一个使用iter的选项

f = open('really_big_file.dat')
def read1k():
    return f.read(1024)

for piece in iter(read1k, ''):
    process_data(piece)

答案 1 :(得分:0)

Python的for循环不是C for循环,而是真正的foreach循环。在您的示例中:

for i in range(0, len(data), chunk_sz):

range()仅被调用一次,然后python迭代返回值(python2中的list,python3中的可迭代range对象)。 IOW,从此POV来看,您的代码段是等效的-区别在于第二个代码段使用了非局部变量length_of_file,因此解决该问题实际上会对性能产生影响。

  

我来自C / C ++背景,在while或for循环中进行每次重复计算都是不好的做法,因为它在每次调用时都会执行

最终的编译器优化将为您提供帮助,对于大多数(即使不是全部)语言也是如此。

这种说法以及其他在评论或答案中已经提及的内容:这不是您按块读取文件的方式-您需要SurajM的第一个代码段。