我正在读取像这样的大块文件
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循环中进行每次重复计算都是不好的做法,因为它会针对每次调用执行。
答案 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的第一个代码段。