Сравнение списков списков Python

У меня есть список, содержащий 10 ** 7 списков в формате:

big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]] 

Каждый список содержит 6 уникальных ints.

Мне нужно сравнить каждый список с другим списком:

 lst = [1, 3, 4, 10, 23, 46] 

и вернуть те, где пересечение элементов списка меньше 3. Таким образом, новый список будет:

 new_list = [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]] 

На данный момент я использую set intersection, но для запуска требуется около 30 секунд

 >>> big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]] >>> normal = set([1, 3, 4, 10, 23, 46]) >>> [x for x in big_list if len(set(x).intersection(normal)) < 3] [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]] 
 import numpy as np biglist = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]] oldlist = [1, 3, 4, 10, 23, 46] b = np.array(biglist) b[np.array([(b == x).any(axis=1) for x in oldlist]).sum(axis=0) < 3] 

возвращается

 array([[ 2, 3, 4, 5, 6, 7], [ 2, 3, 4, 26, 33, 40]]) 

Создание массива numpy занимает некоторое время, но последняя строка примерно в два раза быстрее, чем понимание списка с заданными пересечениями (для списков 1е6).

EDIT: следующая строка еще быстрее, чем мой код выше и требует меньше памяти:

 b[reduce(np.add, ((b == x).any(axis=1).astype(np.int) for x in oldlist)) < 3] 

Я думаю, что «быстрое» решение должно зависеть от спецификации вашей проблемы. Например, если ваш список ссылок так же короток, как [1, 3, 4, 10, 23, 46], отсортировав каждый список, мы сразу увидим, что все списки, начинающиеся с числа больше 10, например [ 11, x, x, …] не будет иметь более трех общих элементов со ссылкой. Это могло бы сэкономить много сравнений.