for elem in list1:
counter = 0
for elem2 in list2:
# тут некоторый медленный код обработки, который я выкинул в примере, переписывать его на сишку нельзя, это модуль на питоне
if elem2 == elem:
counter += 1
sub_list.append(counter)
list1 содержит от 10 до 20 000 элементов, в среднем 6 000 элементов, list2 содержит около пары тысяч элементов. list2 у меня динамически грузится с жесткого диска в ещё одном внешнем цикле, их около 10 000. Как-то печально всё со скоростью перелопачивания. sub_list это на самом деле строки для csv файла, который я пытаюсь сгенерировать. Это как-то можно быстрее делать, например, внеся батарейки на сишке, помазав всё лямбдами или как-то ещё (на первый взгляд кажется что нельзя)? А то чувствую до утра считать будет. Не к спеху, конечно, всего 4 раза посчитать надо будет с разными параметрами, но на будущее хочется знать.
Самое эффективное решение этой задачи - сохранить данные не в два списка, а в два множества (set/frozenset) и взять их пересечение (intersection).
Для лучшего понимания стоит почитать структуры данных и алгоритмические сложности их методов.
Есть, именно по этому там counter += 1. Точнее в list1 гарантированно нет повторений, но мне важен порядок в котором будет sub_list. А вот в list2 точно есть повторения и вообще всякое разное. Немного ошибся в первом посте, поправлю сейчас.
map2 = dict()
for i in list2:
if i in map2:
map2[i] += 1
else:
map2[i] = 1
for i in list1:
if i in map2:
sub_list.append(map2[i])
else:
sub_list.append(0)