0

我对从文件中提取列标题数据以供以后使用的最快方法感兴趣。下面我尝试了两种不同的方法:Subprocess/head 和 DictReader。结果有多个不同的数量级。

import subprocess
from csv import DictReader

def head_test():
    pipe = subprocess.Popen(['head','-n','1','file_data.txt'],stdout=subprocess.PIPE, universal_newlines=True)
    for row in pipe.stdout:
        fields = row.strip().split('\t')

def dictreader_test():
    with open('file_data.txt') as f:
        f_info = DictReader(f,delimiter='\t')
        fields = f_info.fieldnames

def fopen_test():
    with open('file_data.txt') as f:
        fields = next(f).strip().split('\t')

def rstrip_test():
    with open('file_data.txt') as f:
        fields = next(f).rstrip().split('\t')

if __name__ == '__main__':
    import timeit
    print(timeit.timeit('head_test()', setup='from __main__ import head_test', number=10000))
    print(timeit.timeit('dictreader_test()', setup='from __main__ import dictreader_test', number=100000))
    print(timeit.timeit('fopen_test()', setup='from __main__ import fopen_test', number=100000))
    print(timeit.timeit('rstrip_test()', setup='from __main__ import rstrip_test', number=100000))

结果:

34.6136500835
0.195073127747

最近 3 次测试的附加结果达到了 100k:

1.85791897774
0.983640909195
0.973639011383

即使 head_test 中的整个 for 循环被注释掉,它也只占大约 20% 的时间。

两个问题: - 有没有更快的方法来获取列标题数据?- 这两种方法之间的主要性能差异是什么?

更新:从响应建议中添加了额外的测试

4

2 回答 2

3

以下应该比 略快DictReader

fields = next(open('file_data.txt')).strip().split('\t')

这是有效的,因为文件对象(由返回open())是从文件中产生行的可迭代对象,因此next(open('file_data.txt'))将返回文件的第一行。

DictReader和之间的主要性能差异Popen是调用单独的程序来读取文件并通过管道将结果传递给 Python 程序所需的开销。

于 2013-05-30T20:11:02.487 回答
0

subprocess.Popen实际上启动了一个外部程序。在 Unices 上,这意味着分叉进程并用其他可执行文件覆盖子进程。与仅读取文件相比,这是很多开销。

DictReader只需要读取文件的第一行,head除了进程创建之外还必须这样做。

于 2013-05-30T20:08:39.873 回答