Python zcat标准管道vs 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:

我已经编写了一个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:
            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更快,基准测试只是捕获输出以查看它。您需要对函数的每个部分进行基准测试,以查看哪个位需要花费时间。最简单的方法是将其分解成单个函数,并对它们进行基准测试。