Как ускорить работу, включая пересечение и объединение множеств под петлями в python - PullRequest
0 голосов
/ 12 апреля 2020
judge = [[0,3,5], [1,2,4],       [1,5,6], [],..., []]
a     = [[1,2],   [2,3,4,5,7,9], [1,4,5], [],..., []]
# len(judge) == len(a)

res_intersect = []
for i in range(len(a)):
    for j in range(i+1,len(a)):
        if len(set(judge[i])&set(judge[j])) != 0:

            res_intersect.append(set(a[i])&set(a[j]))

a и судья имеют одинаковую длину, и оба гораздо больше, чем 10000. Мне нужно делать эти операции с разными а и судить сотни раз, в то время как я считаю, что numba не может поддерживать set (), как ускорить это ? Заранее спасибо!

1 Ответ

0 голосов
/ 12 апреля 2020
  1. Преобразуйте содержимое ваших входных данных list с в set с заранее и сэкономьте много времени
  2. Используйте isdisjoint для проверки перекрытия без необходимости делать временные set без необходимости
  3. Используйте itertools.combinations, чтобы упростить ваше вложенное l oop

Со всеми изменениями:

judge = [[0,3,5], [1,2,4],       [1,5,6], [],..., []]
a     = [[1,2],   [2,3,4,5,7,9], [1,4,5], [],..., []]
# len(judge) == len(a)

res_intersect = []
for (j1, a1), (j2, a2) in itertools.combinations(zip(map(set, judge), map(set, a)), 2)):
    if not j1.isdisjoint(j2):
        res_intersect.append(a1 & a2)

Вероятно, не выигрывает от numba, но это должно значительно сократить накладные расходы, избегая абсолютной тонны временных set с.

...