我有一个大约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分钟才能完成。
它已经完成了它的工作,但是作为一个新手,我一直很热衷于学习改进我的编码并分享这些经验的方法。我的问题是,可以进行哪些更改以提高此代码的性能?
由于您通过查找文件中的行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] 删除。
我来说两句