什么';通过Python列表中的对象属性获取第一个匹配项的最快方法是什么?

什么';通过Python列表中的对象属性获取第一个匹配项的最快方法是什么?,python,Python,我有一行这样的代码: event = [x for x in history if x.serial == serialized_event] 在我的应用程序的所有情况下,生成的列表将只包含一个项目。但在我看来,它似乎将遍历整个“历史”列表,寻找所有可能的匹配项 这是不必要的,尤其是因为在大多数情况下,它会在前几个索引中找到我要查找的内容,并且它实际上是唯一的结果 如何使其更有效?如果不需要一个衬里,只需使用带中断的常规for循环: event = [] for x in history:

我有一行这样的代码:

event = [x for x in history if x.serial == serialized_event]
在我的应用程序的所有情况下,生成的列表将只包含一个项目。但在我看来,它似乎将遍历整个“历史”列表,寻找所有可能的匹配项

这是不必要的,尤其是因为在大多数情况下,它会在前几个索引中找到我要查找的内容,并且它实际上是唯一的结果


如何使其更有效?

如果不需要一个衬里,只需使用带中断的常规for循环:

event = []
for x in history:
    if x.serial == serialized_event:
        event.append(x)
        break

如果不需要一个衬垫,只需使用一个常规的带中断的for回路:

event = []
for x in history:
    if x.serial == serialized_event:
        event.append(x)
        break

如果要保留一行,请使用
itertools.dropwhile
筛选不需要的结果,并仅获取第一个匹配项:

from itertools import dropwhile

event = next(dropwhile(lambda x: x.serial==serialized_event, history))

如果要保留一行,请使用
itertools.dropwhile
筛选不需要的结果,并仅获取第一个匹配项:

from itertools import dropwhile

event = next(dropwhile(lambda x: x.serial==serialized_event, history))

x.serial
是否已排序?抱歉,没有正确阅读问题。。。但我认为这个问题非常接近你想要的——不是天生的,但很容易做到。历史是一个Django查询集。什么样的数据结构是
History
?你能优化它吗?例如,字典和集合的成员身份检查时间复杂度为O(1)。但是,如果您总是在前两个索引中找到结果,那么听起来这并不是一个瓶颈,因此优化最终可能会花费比节省更多的成本。更重要的是,数据库上的搜索可能比Pythonis
x.serial
sorted更快?对不起,没有正确阅读问题。。。但我认为这个问题非常接近你想要的——不是天生的,但很容易做到。历史是一个Django查询集。什么样的数据结构是
History
?你能优化它吗?例如,字典和集合的成员身份检查时间复杂度为O(1)。但是,如果您总是在前两个索引中找到结果,那么听起来这并不是一个瓶颈,因此优化最终可能会花费比节省更多的成本。更重要的是,在DB上的搜索可能比在Python中更快