Python按条件统计对象数组元素的最优方法及列表推导式用法
对象数组多条件统计性能优化方案
现有实现的性能问题
你当前使用三次独立列表推导的写法,存在两个明显的性能损耗点:
- 会对整个数组完成3次全量遍历,时间复杂度为O(3n)
- 每次筛选都会生成实际存储符合条件元素的列表对象,产生不必要的内存开销
数据量达到上万条时,这些损耗会被放大,完全有优化空间。
最优优化方案
核心思路是仅做1次全量遍历,遍历过程中直接完成计数累加,不生成多余的中间列表,时间复杂度直接降到O(n),性能比原有实现提升2倍以上。
固定统计维度的简单写法
如果只需要统计viw、edit、crt三类固定值,直接写分支判断累加即可:
view_count = 0 edit_count = 0 crt_count = 0 for item in user_record: item_type = item["type"] if item_type == "viw": view_count += 1 elif item_type == "edit": edit_count += 1 elif item_type == "crt": crt_count += 1
可扩展的字典计数写法
如果后续可能新增其他统计类型,推荐用字典做计数器,不用修改遍历逻辑就能适配新类型,性能和手动写分支几乎一致:
from collections import defaultdict count_dict = defaultdict(int) for item in user_record: count_dict[item["type"]] += 1 # 需要取值时直接从字典取即可,不存在的类型默认返回0 view_count = count_dict["viw"] edit_count = count_dict["edit"] crt_count = count_dict["crt"]
关于列表推导式使用OR条件的说明
列表推导式的if判断完全支持OR逻辑,直接使用or关键字拼接条件即可,示例:
# 筛选所有type为viw或edit的元素 target_list = [item for item in user_record if item["type"] == "viw" or item["type"] == "edit"]
注意:这种写法仅适合筛选单组合并条件的场景,如果用来做多维度分别计数,依然会产生多次遍历的额外开销,不适合当前的统计需求。
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

