python - 如何提高 Python 在大文件上的迭代性能

标签 python performance iteration large-files

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

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

我有一个大约 650,000 行的数据文件,具有以下结构:(簇、偏移量、大小) - 其中偏移量是唯一的,但大小不是。

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 分钟才能完成。

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

最佳答案

您可以执行以下操作,获取字典 dic 并执行以下操作(以下是伪代码,我也假设大小不重复)

       for index,size in the first file:
           dic[size] = index
       for index,offset,size in second file:
          if size in dic.keys():
             print dic[size],offset

关于python - 如何提高 Python 在大文件上的迭代性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37363280/

相关文章:

python - "library"方法的范围

Python:计算文件行中一组特定字符的出现次数

c# - C# 或 C 的高性能 RSA 实现

python - 在 Python 中,当遍历列表中的项目时,如果到达末尾,如何从 0 开始?

jasper-reports - 碧 Jade 报告 : iterating List inside JRXML

python - python 中括号运算符如何工作?

jquery - Flask-Restful API 和 JSON 问题中的 Unicode

python - 在 Python2 和 Python 3 中使用 "+="与 "extend"进行列表串联

arrays - numpy.array(list) 很慢

javascript - 如何迭代数组并将结果存储在单个对象或变量中?