如何提高大文件的Python迭代性能

波贝尔

我有一个大约9,000行的参考文件,并具有以下结构:(索引,大小)-其中索引是唯一的,但大小可能不是。

0 193532
1 10508
2 13984
3 14296
4 12572
5 12652
6 13688
7 14256
8 230172
9 16076

我有一个大约65万行的数据文件,并具有以下结构:(群集,偏移量,大小)-其中偏移量是唯一的,但大小不是。

446 0xdf6ad1 34572
447 0xdf8020 132484
451 0xe1871b 11044
451 0xe1b394 7404
451 0xe1d12b 5892
451 0xe1e99c 5692
452 0xe20092 6224
452 0xe21a4b 5428
452 0xe23029 5104
452 0xe2455e 138136

我需要比较参考文件第二列中的每个大小值是否与数据文件第三列中的大小值匹配。如果匹配,则输出偏移量十六进制值(数据文件中的第二列)和索引值(参考文件中的第一列)。目前,我正在使用以下代码执行此操作,并将其通过管道传递到新文件中:

#!/usr/bin/python3

import sys

ref_file = sys.argv[1]
dat_file = sys.argv[2]

with open(ref_file, 'r') as ref, open(dat_file, 'r') as dat:

    for r_line in ref:
        ref_size = r_line[r_line.find(' ') + 1:-1]

        for d_line in dat:
            dat_size = d_line[d_line.rfind(' ') + 1:-1]
            if dat_size == ref_size:
                print(d_line[d_line.find('0x') : d_line.rfind(' ')]
                      + '\t'
                      + r_line[:r_line.find(' ')])
        dat.seek(0)

典型的输出如下所示:

0x86ece1eb  0
0x16ff4628f 0
0x59b358020 0
0x27dfa8cb4 1
0x6f98eb88f 1
0x102cb10d4 2
0x18e2450c8 2
0x1a7aeed12 2
0x6cbb89262 2
0x34c8ad5   3
0x1c25c33e5 3

这可以正常工作,但对于给定的文件大小,大约需要50分钟才能完成。

它已经完成了它的工作,但是作为一个新手,我一直很热衷于学习改进我的编码并分享这些经验的方法。我的问题是,可以进行哪些更改以提高此代码的性能?

schwobaseggl

由于您通过查找文件中的行size,因此这些大小应该是任何字典数据结构中的键。您将需要摆脱这本词典的嵌套循环,而嵌套循环才是真正的性能杀手。此外,由于大小不是唯一的,因此您将必须使用offset/index值的列表(取决于要存储在字典中的文件)。Adefaultdict将帮助您避免一些笨拙的代码:

from collections import defaultdict

with open(ref_file, 'r') as ref, open(dat_file, 'r') as dat:
    dat_dic = defaultdict(list)  # maintain a list of offsets for each size
    for d_line in dat:
        _, offset, size = d_line.split()
        dat_dic[size].append(offset)

    for r_line in ref:
        index, size = r_line.split()
        for offset in dat_dic[size]:  
            # dict lookup is O(1) and not O(N) ...
            # ... as looping over the dat_file is
            print('{offset}\t{index}'.format(offset=offset, index=index))

如果输出线的顺序无关紧要,则可以考虑采用另一种方法,因为您的输出线dat_file太大了defaultdict,因此使用它来构建会占用更多的RAM。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何提高大数据性能?

来自分类Dev

如何提高python中的迭代性能

来自分类Dev

有没有办法提高大文件解析日期的速度?

来自分类Dev

如何在Python中提高大数模乘法的效率

来自分类Dev

如何提高大型数据集中Python计算的速度?

来自分类Dev

如何通过替换“ for-loop”和“ if-else”子句来提高大型数据集的性能

来自分类Dev

使用jq处理大文件时提高性能

来自分类Dev

如何提高python dict的性能?

来自分类Dev

如何提高大n的Fibonacci实现的精度?

来自分类Dev

提高大表有序顶部查询的性能

来自分类Dev

提高大型数据集上谓词的性能

来自分类Dev

创建辅助表以提高大型MySQL表的性能?

来自分类Dev

在python中迭代并匹配大文件

来自分类Dev

如何提高此Python代码的性能?

来自分类Dev

如何提高此Python代码的性能?

来自分类Dev

如何提高多线程 python 程序的性能?

来自分类Dev

如何提高大数双精度型的精度?

来自分类Dev

在Python 3.4中提高大型字典的速度

来自分类常见问题

如何提高Spark性能?

来自分类Dev

如何提高randomForest的性能?

来自分类Dev

如何提高SVM的性能?

来自分类Dev

如何提高FlowDocumentScrollViewer的性能?

来自分类Dev

如何提高ClojureScript性能

来自分类Dev

如何提高paramiko的性能

来自分类Dev

如何提高ILIKE的性能?

来自分类Dev

如何提高Unity性能?

来自分类Dev

如何提高JAXB性能?

来自分类Dev

如何提高paramiko的性能

来自分类Dev

如何提高Groovy的性能?