Python列表过滤代码随整数阈值增大运行时长剧增的原因咨询
Python列表过滤代码随整数阈值增大运行时长剧增的原因咨询
嘿,我来帮你拆解下这个问题的核心原因~
首先看你的代码逻辑:你通过遍历列表的副本lists[:],在原列表上调用list.remove(i)来删除符合条件的元素。问题就出在list.remove()这个方法的底层实现上:
remove(i)会从列表开头开始逐个遍历查找,直到找到第一个匹配的元素,这个查找过程的时间复杂度是O(n)(n是当前列表的长度);- 找到元素后删除它时,列表中该元素后面的所有元素都要向前移动一位来填补空缺,这又是一次O(n)的操作。
那为什么阈值从3改成4时,运行时间会暴增呢?你可能搞反了逻辑:
当阈值设为3时,你只需要删除长度小于3的单词(1、2个字母的);而阈值改成4时,要删除的是长度小于4的单词(包含1、2、3个字母的)——也就是说,需要执行删除操作的元素数量变多了!每多删一个元素,就要多跑一次“查找+移动元素”的高成本操作,总耗时自然就大幅上升了。
你之前的误解“列表初始长度一样,耗时应该差不多”是不成立的,因为不同阈值下需要执行的remove次数完全不同,而每次remove的开销都很高。
优化方案:用列表推导式大幅提升效率
想要解决这个问题,推荐用列表推导式来做过滤,它只需要一次遍历就能生成新列表,时间复杂度是O(n),不管阈值怎么调整,速度都会快很多:
# 用with语句自动管理文件,比手动close更安全 with open("words_alpha.txt") as f: word_list = f.read().split() # 设置你需要的阈值,比如4 threshold = 4 # 一次性过滤出长度符合要求的单词 word_list = [word for word in word_list if len(word) >= threshold]
哪怕你把阈值调得更大(比如5),需要删除的元素更少,原方法的效率也远不如列表推导式——因为列表推导式没有多次查找和元素移动的额外开销。
备注:内容来源于stack exchange,提问作者Sehnyu
相关产品推荐
相关产品推荐

