You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:百万次调用场景下按属性提取对象子列表的最快方法

最优方案:预分组实现O(1)级别的查询性能

既然你要面对数百万次的查询调用,那每次查询都遍历整个列表的做法绝对不可取——反复的O(n)操作叠加起来,性能开销会直接爆炸。最靠谱的解法是提前做一次预分组,把列表按name属性分成固定的两组,之后每次查询直接返回对应的分组即可,单次查询复杂度降到O(1)。

具体实现代码

我们可以用字典来存储分组结果,collections.defaultdict用起来会更顺手:

from collections import defaultdict

# 只需要执行一次的预分组操作
grouped = defaultdict(list)
for item in l:
    grouped[item.name].append(item)

# 之后百万次查询直接调用,速度拉满
a_sub_list = grouped['a']
b_sub_list = grouped['b']

为什么这是最快的?

  • 预分组阶段只需要遍历一次原列表(O(n)时间),之后所有查询都是直接从字典中取对应的列表,完全没有循环操作,单次查询耗时可以忽略不计。
  • 对比常见的列表推导式[x for x in l if x.name == 'a']:每次查询都要遍历整个列表,百万次调用就是百万 × n次操作,性能差距会随着查询次数的增加呈指数级拉大。

额外说明

如果你的原列表是静态的(不会新增、删除元素),这个方案就是性能天花板。如果列表是动态变化的,只需要在修改列表时同步维护grouped字典即可:比如新增Foo实例时,直接把它添加到对应的grouped[new_item.name]列表里;删除元素时,从对应分组中移除它(注意如果是频繁删除,可能需要用更高效的结构,比如set,但前提是对象是可哈希的)。

内容的提问来源于stack exchange,提问作者Tommy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:53:14