Python中如何高效将二维列表内指定词汇替换为<UNK>?
性能问题核心原因
- 原方案使用列表做成员查询:列表的
in操作时间复杂度为O(n),5.5万长度的td每次查询要遍历最多5.5万次,是性能差的核心原因 - 第二套numpy方案采用三层嵌套循环,时间复杂度达到O(td长度 * 总词数),运算量超过10^10次,必然极慢
- 第一套列表推导式写法错误,直接把二维嵌套列表压成了一维列表,不符合数据结构要求
最优纯Python实现方案
第一步:将td转换为集合(核心优化)
集合的成员查询时间复杂度为O(1),直接把查询性能提升几个数量级:
td_set = set(td)
第二步:用正确的嵌套列表推导式处理数据
保持原二维列表结构,遍历每个句子的每个词汇即可,无需下标遍历:
train_dataset = [ ['<UNK>' if word in td_set else word for word in sentence] for sentence in train_dataset ]
更高性能可选方案(字典映射)
如果需要进一步压缩耗时,可以用预构建的替换字典,查询速度比集合略快:
# 构建替换映射表 replace_map = {word: '<UNK>' for word in td} # 批量替换 train_dataset = [ [replace_map.get(word, word) for word in sentence] for sentence in train_dataset ]
性能参考
15万条句子、总词汇量约200万的场景下,上述方案在普通CPU环境下耗时仅0.5~2秒,远快于原方案。
内容的提问来源于stack exchange,提问作者Parsh
相关产品推荐
相关产品推荐

