为什么查找列表最大值索引的Python列表推导式运行速度远慢于普通循环
Python列表最大值索引查找性能差异原因解析
核心性能差距根源
你对第一种实现的时间复杂度预估有误,它并非只遍历两次列表,而是达到了O(n²) 时间复杂度,这是两种方法性能相差上千倍的核心原因:
- 你将
max(nums)直接写在了列表推导式的if判断条件中,Python不会自动对这类表达式做执行时机优化,每遍历一个元素做条件判断时,都会重新执行一次max(nums)全量遍历列表计算最大值。
以你10000长度的测试用例为例,第一种方法会执行10000次max(nums),每次都要遍历10000个元素,总操作量达到亿级;而第二种方法仅需要遍历1次列表,总操作量只有万级,自然会出现上千倍的性能差距。
第一种写法的优化方案
你只需要把最大值提前计算并缓存成变量,就能把时间复杂度降到O(n),性能和第二种方法处于同一量级,优化后代码如下:
def find_indexes_1_fixed(nums): max_val = max(nums) return [index for index, number in enumerate(nums) if number == max_val]
优化后的版本仅会遍历两次列表:第一次计算最大值,第二次收集符合要求的索引,既保留了列表推导式的简洁性,也解决了性能问题。
额外注意点
第二种实现存在边界问题:你初始化largest = 0,如果输入列表所有元素都是负数,该方法会返回错误结果,建议把初始值修改为largest = float('-inf')适配全场景。
内容的提问来源于stack exchange,提问作者Fin H
相关产品推荐
相关产品推荐

