LeetCode最后一个单词长度问题:为何split()解法比循环计数更快?
关于LeetCode「最后一个单词的长度」的解法性能疑问
LeetCode上的「最后一个单词的长度」问题中,有开发者发现使用split()方法的Python解法,比手动循环计数最后一个单词长度的两种解法运行速度更快,这是为什么?
使用split()的解法
class Solution: def lengthOfLastWord(self, s: str) -> int: for word in s.split(' ')[::-1]: if word != '': return len(word)
两种循环计数解法
解法一
class Solution: def lengthOfLastWord(self, s: str) -> int: firstLetter = len(s) -1 for i in range(firstLetter, -1, -1): if s[i] != ' ': firstLetter = i break for i in range(firstLetter, -1, -1): if s[i] == ' ': return firstLetter - i return firstLetter+1
解法二
class Solution: def lengthOfLastWord(self, s: str) -> int: # 去除末尾空格 p = len(s) - 1 while p >= 0 and s[p] == ' ': p -= 1 # 计算最后一个单词的长度 length = 0 while p >= 0 and s[p] != ' ': p -= 1 length += 1 return length
性能差异的核心原因
看起来反直觉,但本质是Python内置方法的底层实现是C语言编写的,和我们用Python代码写的循环不在同一执行层级:
- 哪怕
s.split(' ')会遍历整个字符串分割成列表,这个过程是在C的原生代码中执行的,单步操作的速度远快于Python解释器逐条处理循环语句。 - 手动写的循环解法,每一次字符判断、变量赋值都要经过Python解释器的字节码解析步骤,哪怕逻辑上只遍历了字符串末尾的一小部分,整体的执行开销也远高于C实现的内置方法。
- 另外,
split方法内部针对字符串分割做了大量优化,比如处理连续空格时是批量处理的,比我们手动逐个字符判断的效率高得多。
内容的提问来源于stack exchange,提问作者Vinggui
相关产品推荐
相关产品推荐

