Оптимизация поиска в словаре с использованием dict.items () для большого набора данных

Однострочный (предупреждение броска)

np.nan_to_num(array1 / array2)
0
задан Ahmed Magdy Moustafa 16 January 2019 в 02:19
поделиться

2 ответа

Предварительно мне кажется, что может иметь больше смысла, вместо того, чтобы хранить ваш диктант как { id : seq }, хранить его как { seq : [id_list] }. Поскольку кажется, что в каждой последовательности много повторов, это сэкономит время при доступе ко всем идентификаторам определенной последовательности. Вы можете сделать это при чтении ваших данных, используя defaultdict со значением по умолчанию в качестве пустого списка, а когда вы читаете идентификатор и последовательность, вы можете добавить его к dict с помощью sequences_dict[record.seq].append(record.description).

Дайте мне знать, если это поможет, и могу ли я помочь с чем-либо еще.

0
ответ дан Sam Hollenbach 16 January 2019 в 02:19
поделиться

Следуя предложению Сэма Холленбаха, я могу внести следующие (4) изменения в ваш код.

import sys
from Bio import AlignIO
from Bio import SeqIO
from Bio.Seq import Seq
import time
start_time = time.time()
from collections import defaultdict


databasefile = sys.argv[1]
queryfile = sys.argv[2]

file_hits = "./" + sys.argv[2].split("_protein")[0] + "_ZeNovo_hits_v1.txt"
file_report = "./" + sys.argv[2].split("_protein")[0] + "_ZeNovo_report_v1.txt"
_format = "fasta" #(change 1)
output_file = open(file_hits, 'w')
output_file_2 = open(file_report,'w')
sequences_dict = defaultdict(list)

output_file.write("{}\t{}\n".format("protein_query", "hits"))
for record in SeqIO.parse(databasefile, _format):
    sequences_dict[record.seq].append(record.description) #(change 2)
    #sequences_dict[record.description] = str(record.seq)
print("processed database in --- {:.3f} seconds ---".format(time.time() - start_time))

processed_counter = 0
for record in SeqIO.parse(queryfile, _format):
    query_seq = record.seq #(change 3)
    count = 0
    output_file.write("{}\t".format(record.description))
    if query_seq in sequences_dict: #(change 4)
        count = len(sequences_dict[query_seq])
        output_file.write('\t'.join(sequences_dict[query_seq]) + "\n")
    processed_counter += 1
    print("processed protein", processed_counter)
    output_file_2.write(record.description+'\t'+str(count)+
                        '\t'+str(len(record.seq))+'\t'+str(record.seq)+'\n')
output_file.close()
output_file_2.close()
print("Done in --- {:.3f} seconds ---".format(time.time() - start_time))

Измените # 1: - измените имя переменной формата на _format (чтобы избежать конфликта с термином Python 'format' и внесите изменения в ваш код, где он используется.

Change # 2 : Используйте record.seq в качестве ключа к словарю и добавьте record.description к списку (в качестве значения)

Изменение № 3: Нет необходимости приводить record.seq к str - это уже строка.

Изменение № 4: эти 3 строки найдут любую подходящую запись намного быстрее, чем итерация по словарю, как в исходном коде.

Я не уверен, как [ 115].

Кроме того, я не могу сказать, что я нашел все изменения, необходимые для полной рабочей программы. Если у вас есть какие-либо вопросы после попытки предложить предлагаемые изменения, дайте мне знать. [1112 ]

0
ответ дан Chris Charley 16 January 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: