Самый эффективный способ найти индексы общих кортежей в двух очень больших списках кортежей в Python 3? - PullRequest
1 голос
/ 24 октября 2019

У меня есть два больших списка кортежей: "neg" (длина ~ 40K) и "All" (длина ~ 2M), чьи прокси можно скачать по следующей ссылке

ftp: //ftp.lrz.de/transfer/List_Intersect/

Я хотел бы найти «neg» внутри «All» и вернуть соответствующие индексы в «All». Я попробовал следующее решение, которое занимает 788,1487 секунд на довольно мощном компьютере (см. Спецификации ниже). Более того, он не сохраняет правильный порядок.

https://stackoverflow.com/a/39500933/6524326

Фактически следующий код выполняет требуемую работу за 202,6451 секунду. Можно ли сделать это еще быстрее?

def findTupleIndices(smallList, bigList):
 comList = sorted(set(smallList) & set(bigList), key=smallList.index)
 idx = [bigList.index(x) for x in comList]
 return(idx)

характеристики ПК

Процессор Intel® R (Core) i7-5930K @ 3,50 ГГц, ОЗУ 32 ГБ DDR4-2133 МГц

1 Ответ

1 голос
/ 24 октября 2019

Smashingly с временной хеш-таблицей (dict), где кортежи "большой список" являются ключами, а их индексы - значениями.

Начальная статистика захода на посадку:

from timeit import timeit

def findTupleIndices(sub_lst, search_lst):
    comList = sorted(set(sub_lst) & set(search_lst), key=sub_lst.index)
    idx = [search_lst.index(x) for x in comList]
    return idx   

# sub_lst, search_lst are lists of tuples extracted from `ftp://ftp.lrz.de/transfer/List_Intersect/`

print(timeit('findTupleIndices(sub_lst, search_lst)', 'from __main__ import findTupleIndices, sub_lst, search_lst', number=1000))

Выход:

191.43023270001868

Статистика нового подхода:

from timeit import timeit

def find_tuple_indices(sub_lst, search_lst):
    pos_dict = dict((t,i) for i, t in enumerate(search_lst))
    return [pos_dict[t] for i, t in enumerate(sub_lst) if t in pos_dict]

# sub_lst, search_lst are lists of tuples extracted from `ftp://ftp.lrz.de/transfer/List_Intersect/`

print(timeit('find_tuple_indices(sub_lst, search_lst)', 'from __main__ import find_tuple_indices, sub_lst, search_lst', number=1000))

Выход:

1.4070011030125897
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...