Python zcat标准管道vs gzip模块
我已经编写了一个python函数,它从用gzip压缩的文本文件中读取。 我使用了gzip模块来读取文件,下面是代码:Python zcat标准管道vs gzip模块,python,pipe,gzip,Python,Pipe,Gzip,我已经编写了一个python函数,它从用gzip压缩的文本文件中读取。 我使用了gzip模块来读取文件,下面是代码: def apertura(file): diz_pagerank = {} with gzip.open(file) as pagerank_file: pagerank_csv = csv.reader(pagerank_file, delimiter='\t') for pagerank in pagerank_csv:
def apertura(file):
diz_pagerank = {}
with gzip.open(file) as pagerank_file:
pagerank_csv = csv.reader(pagerank_file, delimiter='\t')
for pagerank in pagerank_csv:
diz_pagerank[pagerank[0]] = float(pagerank[1])
return diz_pagerank
我读过gzip模块与zcat相比速度非常慢。我已经测量了执行的时间:
时间:实际1m31.112s
用户1m29.420s
sys 0m1.684s 我重写了使用子流程模块的代码,直接使用zcat打开文件:
def apertura(file):
diz_pagerank = {}
process = subprocess.Popen(['zcat', file], stdout=subprocess.PIPE)
for pagerank in iter(process.stdout.readline, ''):
pagerank = pagerank.strip().split('\t')
diz_pagerank[pagerank[0]] = float(pagerank[1])
return diz_pagerank
但现在的功能要慢得多!
这是时间的结果:实际5m26.536s
用户2m19.976s
系统3m11.904s
怎么可能呢?我哪里做错了?其他加快速度的技巧?与子进程的通信需要每个块(一个用于子进程,一个用于父进程)额外的两个系统调用(写入+读取)加上两个额外的上下文开关。这两个函数非常不同。使用zcat捕获输出比使用gzip.open更快,基准测试只是捕获输出以查看它。您需要对函数的每个部分进行基准测试,以查看哪个位需要花费时间。最简单的方法是将其分解成单个函数并对它们进行基准测试。与子进程的通信需要每个块(一个用于子进程,一个用于父进程)两个额外的系统调用(写+读)加上两个额外的上下文开关。这两个函数非常不同。使用zcat捕获输出比使用gzip.open更快,基准测试只是捕获输出以查看它。您需要对函数的每个部分进行基准测试,以查看哪个位需要花费时间。最简单的方法是将其分解成单个函数,并对它们进行基准测试。