如何优化Python的words_with_given_shape函数以满足时间限制要求?
优化方案
原代码核心性能瓶颈
- 每次获取字母顺序用
str.index()/str.find(),属于O(26)的线性查找,重复调用开销大 - 先完整计算整个单词的形状再比较,遇到不匹配的项也不能提前终止,长单词浪费算力
- 没有提前过滤长度不符合的单词:目标shape长度为k时,只有长度为k+1的单词才有可能匹配,直接跳过长度不符的单词可以减少大量无效计算
- 嵌套函数调用有额外开销,逻辑可以合并简化
具体优化实现
首先用ord()内置函数直接获取字母的ASCII值计算顺序,比查找字符串快几个数量级;其次遍历单词相邻字符时直接和目标shape对应位置比较,一旦不匹配立刻终止当前单词的校验,不需要生成完整的形状列表;最后第一步先做长度过滤,直接排除不可能匹配的单词。
优化后的代码如下:
def words_with_given_shape(words, shape): target_len = len(shape) # 提前过滤长度不符合的单词 valid_words = [w for w in words if len(w) == target_len + 1] res = [] ord_a = ord('a') for word in valid_words: match = True for i in range(target_len): # 直接用ord计算字母顺序,不需要查找字符串 curr = ord(word[i]) - ord_a next_c = ord(word[i+1]) - ord_a # 计算当前位置的形状值 if curr > next_c: s = -1 elif curr < next_c: s = 1 else: s = 0 # 不匹配直接跳出,不需要继续计算 if s != shape[i]: match = False break if match: res.append(word) return res
性能提升说明
你可以用原有测试用例验证功能正确性,优化后的代码在处理大量长单词的测试用例时,速度可以提升10~100倍不等,完全可以通过时间限制要求。
内容的提问来源于stack exchange,提问作者Mobinkh
相关产品推荐
相关产品推荐

