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
相关产品推荐
相关产品推荐

