Однострочный (предупреждение броска)
np.nan_to_num(array1 / array2)
Предварительно мне кажется, что может иметь больше смысла, вместо того, чтобы хранить ваш диктант как { id : seq }
, хранить его как { seq : [id_list] }
. Поскольку кажется, что в каждой последовательности много повторов, это сэкономит время при доступе ко всем идентификаторам определенной последовательности. Вы можете сделать это при чтении ваших данных, используя defaultdict
со значением по умолчанию в качестве пустого списка, а когда вы читаете идентификатор и последовательность, вы можете добавить его к dict с помощью sequences_dict[record.seq].append(record.description)
.
Дайте мне знать, если это поможет, и могу ли я помочь с чем-либо еще.
Следуя предложению Сэма Холленбаха, я могу внести следующие (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 ]