【问题标题】:Efficient processing of email list in PythonPython中电子邮件列表的高效处理
【发布时间】:2025-11-23 00:40:02
【问题描述】:

我有一个很长的电子邮件列表,我想处理:

  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

【问题讨论】:

  • 如果您不确定瓶颈在哪里,您可以使用 cProfile 运行它以查看一直占用的时间。
  • 很可能您使用的任何正则表达式都是这里的瓶颈。介意张贴吗?编译了吗?
  • @jozzas,他使用它的方式是:email_re.match(email),它仅在 email_re 是已编译的正则表达式时有效。

标签: python performance list iterator


【解决方案1】:

查看:Does Python have an ordered set?,然后选择您喜欢的实现。

就这样:

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)

可能是您可以实现的最快、最简单的解决方案。

【讨论】:

    【解决方案2】:

    我想不出任何方法来加快你所拥有的速度。使用set 跟踪事物很快,使用list 存储列表也很快。

    我喜欢OrderedSet 解决方案,但我怀疑OrderedSet 的Python 实现会比您编写的更快。

    您可以使用OrderedDict 来解决此问题。但这是为 Python 2.7 添加的。您可以使用配方(例如:http://code.activestate.com/recipes/576693/)来添加 OrderedDict,但我认为它不会比您拥有的更快。

    我试图想出一个用 C 实现的 Python 模块来解决这个问题。我认为这是击败您的代码的唯一希望。但我什么都没想到。

    如果您可以摆脱 dups 标志,只需运行更少的 Python 代码就会更快。

    有趣的问题。祝你好运。

    【讨论】:

      最近更新 更多