Следующая программа работает около ~ 22 часов на двух файлах (txt, ~ 10MB ea.). Каждый файл имеет около ~ 100 тыс. Строк. Может ли кто-нибудь дать мне указание на то, насколько неэффективен мой код и, возможно, более быстрый метод. Входные ДИКТ упорядочены и сохранение порядка необходимо:Эффективность сравнения двух словарей
import collections
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
Su = {}
with open ('Sucrose_rivacombined.txt') as f:
for line in f:
(key, val) = line.split('\t')
Su[(key)] = val
Su_OD = collections.OrderedDict(Su)
Su_keys = Su_OD.keys()
Et = {}
with open ('Ethanol_rivacombined.txt') as g:
for line in g:
(key, val) = line.split('\t')
Et[(key)] = val
Et_OD = collections.OrderedDict(Et)
Et_keys = Et_OD.keys()
merged_keys = Su_keys + Et_keys
merged_keys = uniq(merged_keys)
d3=collections.OrderedDict()
output_doc = open("compare.txt","w+")
for chr_local in merged_keys:
line_output = chr_local
if (Et.has_key(chr_local)):
line_output = line_output + "\t" + Et[chr_local]
else:
line_output = line_output + "\t" + "ND"
if (Su.has_key(chr_local)):
line_output = line_output + "\t" + Su[chr_local]
else:
line_output = line_output + "\t" + "ND"
output_doc.write(line_output + "\n")
входных файлов следующим образом: не каждый ключ присутствует в обеих файлах
Su:
chr1:3266359 80.64516129
chr1:3409983 100
chr1:3837894 75.70093458
chr1:3967565 100
chr1:3977957 100
Et:
chr1:3266359 95
chr1:3456683 78
chr1:3837894 54.93395855
chr1:3967565 100
chr1:3976722 23
Я хотел бы выход выглядеть следующим образом:
chr1:3266359 80.645 95
chr1:3456683 ND 78
Почему бы не профиль его на более мелкие входы и убедитесь сами, когда время тратится? – NPE
Я не уверен, как это сделать. Раньше я запускал его на половинчатых файлах, и потребовалось всего около 3 часов.Использование ЦП составляет 25%, а оперативная память - всего около 1,6 ГБ с ~ 6 ГБ, поэтому его не так привлекают ресурсы. Мне просто интересно, неправильно ли я закодировал что-то, что заставило его продолжать чтение файлов без необходимости. – jobrant
Вы подтвердили, что это делает то, что вы хотите? Поскольку 'Su' является нормальным dict, вы уже потеряли порядок файловой системы, когда вы конвертируете его в' Su_OD'. Вероятно, вы хотите создать упорядоченный фронт? –