Улучшена скорость итерации по 2 спискам python - PullRequest
0 голосов
/ 08 октября 2019

У меня есть цикл, который повторяет более 2 списков.

excel_data - это список, созданный из электронной таблицы Excel, с новыми данными.

exists - это список, созданный из SQL-запроса, существующих данных.

Мне нужно сравнить два и выполнить ОБНОВЛЕНИЕ SQL, если во 2-м столбце 2-го списка excel_data для той же записи изменилось значение из exists.

В настоящее время цикл, которыйзанимает время, равное

excel_data = [[0 for x in range(2)] for y in range(20000)]
exists = [[0 for x in range(2)] for y in range(20000)]


for i in range(0, len(excel_data)):
    for j in range(0, len(exists)):
        if exists[j][0] in excel_data[i][0] and exists[j][1] != excel_data[i][1]:
           print("")

Поскольку оба списка имеют размер чуть меньше 20000 и будут только увеличиваться с течением времени, это эквивалентно итерации 400 миллионов раз. Это завершается через несколько минут, но мне было интересно, можно ли как-нибудь существенно сократить число итераций или каким-нибудь другим более коротким способом получить индекс строки, которая имеет разницу во 2-м столбце.

Входные данные выглядят следующим образом:

Sam Adams   **********@gmail.com
Sammy Adams **********@gmail.com
Samuel Adams    **********@gmail.com
Samantha Adams  **********@gmail.com
Sam Adams   **********@gmail.com

Я ищу, чтобы увидеть, есть ли во 2-м столбце, в этом случае, электронное письмо имеет какие-либо изменения для данного имени в той же строке.

1 Ответ

0 голосов
/ 08 октября 2019

Со словарями:

excel_data = [[x for x in range(y, y + 2)] for y in range(20001)]
exists = [[x for x in range(y, y + 2)] for y in range(20000)]

exists[10][1] = 0  # let change at the least one element

d1 = dict(excel_data)
d2 = dict(exists)


d = {};
for k in d2:  # faster than a comprehension
    if d2[k] != d1[k]: 
        d[k] = d1[k], d2[k]

print (len(d))

Как уже было сказано в комментарии, в качестве альтернативы вы можете преобразовать в наборы кортежей (пар) или, для более высокой эффективности, заморозить и вычислить разность наборов.

d = frozenset(d2.items()) - frozenset(d1.items())

Кажется, что производительность выше, но на тот же порядок (и, конечно, без постоянной сложности), в то время как словари несколько более интуитивны и ближе к оригинальной версии.

Как сказано в первых комментариях, вы можете использовать библиотеку, такую ​​как Pandas, чтобы найти разность Выводить разницу в два кадра данных Pandas рядом - выделение разницы

Существуют и другие рамки длянарезка и нарезка на столы, например, petl https://petl.readthedocs.io/en/v0.24/case_study_1.html

PS Интересный факт. Заданная версия медленнее. Более того, после выполнения заданной версии следующие команды работают медленнее, пока не будет собран мусор.

...