Эффективная обработка списка рассылки в Python - PullRequest
4 голосов
/ 31 августа 2011

У меня очень длинный список электронных писем, которые я хотел бы обработать:

  1. отделяет хорошие письма от плохих и
  2. удаляйте дубликаты, но сохраняйте все не дубликаты в том же порядке.

Это то, что я имею до сих пор:

email_list = ["joe@example.com", "invalid_email", ...]
email_set = set()
bad_emails = []
good_emails = []
dups = False
for email in email_list:
    if email in email_set:
        dups = True
        continue
    email_set.add(email)
    if email_re.match(email):
        good_emails.append(email)
    else:
        bad_emails.append(email)

Мне бы хотелось, чтобы этот фрагмент кода был максимально быстрым и менее значимым, чтобы минимизировать требования к памяти. Есть ли способ улучшить это в Python? Может быть, использовать списочные или итераторы?

РЕДАКТИРОВАТЬ: Извините! Не забывайте упоминать, что это Python 2.5, поскольку он предназначен для GAE.

email_re от django.core.validators

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Я не могу придумать способ ускорить то, что у тебя есть.Быстро использовать set для отслеживания вещей, и быстро использовать list для хранения списка.

Мне нравится решение OrderedSet, но я сомневаюсь в реализации Python OrderedSet будет быстрее, чем вы написали.

Вы можете использовать OrderedDict для решения этой проблемы.Но это было добавлено для Python 2.7.Вы можете использовать рецепт (например: http://code.activestate.com/recipes/576693/), чтобы добавить OrderedDict, но, опять же, я не думаю, что это будет быстрее, чем у вас.

Я пытаюсь придуматьМодуль Python, который реализован на C для решения этой проблемы. Я думаю, что это единственная надежда побить ваш код. Но я ни о чем не думал.

Если вы можете избавиться от флага dups,это будет быстрее, если будет меньше кода Python.

Интересный вопрос. Удачи.

2 голосов
/ 31 августа 2011

Посмотрите на: Есть ли у Python упорядоченный набор? и выберите реализацию, которая вам нравится.

Так что просто:

email_list = OrderedSet(["joe@example.com", "invalid_email", ...])

bad_emails = [] 
good_emails = []

for email in email_list:
    if email_re.match(email):
        good_emails.append(email)
    else:
        bad_emails.append(email)

Возможно, это самый быстрый исамое простое решение, которое вы можете достичь.

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