Если у вас примерно 300 тыс. Совпадений - вы воссоздаете все более крупные set
с, которые содержат точно такие же элементы, как list
, к которым вы уже добавляете:
for found in re.finditer(r"[-N]", DNA_sequence):
position = found.start() + 1
positions_list.append(position)
positions_set = set(positions_list) # 300k times ... why? why at all?
Вместо этого вы можете просто использовать полученный список и поместить его в свой all_positions_set
после того, как найдете все из них:
all_positions_set = all_positions_set.union(positions_list) # union takes any iterable
Это должно уменьшить память более чем на 50% (наборыдороже, чем списки), а также значительно сократить время выполнения.
Я не уверен, что быстрее, но вы можете даже пропустить с помощью регулярных выражений:
t = "ATGCN-ATGCN-ATGCN-ATGCN-ATGCN-ATGCN-ATGCN-ATGCN-"
pos = []
for idx,c in enumerate(t):
if c in "N-":
pos.append(idx)
print(pos) # [4, 5, 10, 11, 16, 17, 22, 23, 28, 29, 34, 35, 40, 41, 46, 47]
и вместо этого использовать enumerate () в вашей строке, чтобы найти позиции .... вам нужно проверить, быстрее ли это.