Python3列表移除指定字符串耗时过长 寻求高效实现方案
问题说明
现有存储图片链接的列表,需要移除列表中所有匹配指定无效链接的元素,原有实现运行耗时长达7秒,存在逻辑错误,需要高效的处理方案。
原始测试数据:
data_list = [ 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2372307693.jpg', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2616355133.jpg', 'http://42.194.197.95:8001/poison_img_url', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p457760035.jpg', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p524964039.jpg', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg', 'http://42.194.197.95:8001/poison_img_url', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p492406163.jpg', 'http://42.194.197.95:8001/poison_img_url' ]
原有错误代码:
def make_url(data_list,remove_str): img_array = [] for index,x in enumerate(data_list): if(remove_str == x): data_list.append(x) print(url_list) if __name__ == "__main__": remove_str = 'http://42.194.197.95:8001/poison_img_url' t1 = time.time() make_url(data_list,remove_str) t2 =time.time() print(t2-t1) # 运行耗时7秒,速度过慢
错误原因
原有代码耗时过长的核心原因是逻辑完全错误:
- 遍历列表过程中,每匹配到一个要移除的目标字符串,就将该字符串再次追加到原列表尾部,导致列表长度持续增长,遍历永远无法结束,自然运行时间极长
- 代码存在未定义变量问题:打印的
url_list从未定义,声明的img_array全程未使用,完全没有实现移除元素的核心逻辑
高效实现方案
使用列表推导式单次遍历过滤目标元素即可,时间复杂度O(n),针对当前数据量耗时在微秒级,无性能问题。
import time def make_url(data_list, remove_str): # 过滤所有不等于目标移除字符串的元素,返回新列表 return [item for item in data_list if item != remove_str] if __name__ == "__main__": remove_str = 'http://42.194.197.95:8001/poison_img_url' t1 = time.time() valid_img_list = make_url(data_list, remove_str) t2 = time.time() print(f"处理耗时:{t2 - t1}秒") print("过滤后有效链接列表:", valid_img_list)
如果需要直接修改原列表而非生成新列表,可以使用切片赋值的写法,性能同样优异:
def make_url_inplace(data_list, remove_str): data_list[:] = [item for item in data_list if item != remove_str]
实现注意点
- 遍历列表的过程中不要直接对原列表做增删操作,否则会导致列表索引错乱、遍历死循环等问题
- 列表推导式是Python中做列表过滤的最高效原生实现,不需要引入额外依赖,执行速度远快于手写循环+append的写法
内容的提问来源于stack exchange,提问作者chino
相关产品推荐
相关产品推荐

