我在练习leetcode第5题。真正让我困惑的是这里C++(20ms)和Python(1000ms)之间巨大的运行时差异。
我知道Python是一种解释性语言,所以一般来说它比C++慢。但是在这里,C++比Python快50倍是我无法理解的。两个程序都使用相同的算法,所以并非如此。是因为C++和Python中字符串的实现方式吗?
C++
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() == 0) return "";
int length = 1, index = 0, subOddLength = 1, subEvenLength = 1, subLength = 1;
for(int i = 1; i < s.size(); ++i){
subOddLength = palindromeLength(s, i, i);
subEvenLength = palindromeLength(s, i - 1, i);
subLength = max(subOddLength, subEvenLength);
if(subLength > length){
length = subLength;
index = i - subLength / 2;
}
}
return s.substr(index, length);
}
private:
int palindromeLength(const string &s, int l, int r){
int n = s.size();
while(l >= 0 & r < n){
if(s[l] != s[r]) break;
l--; r++;
}
l++; r--;
return r - l + 1;
}
};
Python
class Solution:
def longestPalindrome(self, s: str) -> str:
def palindrome_length(l, r):
while l >= 0 and r < len(s):
if s[l] != s[r]: break;
l -= 1; r += 1
l += 1; r -= 1
return r - l + 1
length, index = 1, 0
for i in range(1, len(s)):
odd_len = palindrome_length(i, i)
even_len = palindrome_length(i - 1, i)
sub_len = max(odd_len, even_len)
if sub_len > length:
length, index = sub_len, i - sub_len // 2
return s[index : index + length]
这些可能不是唯一的原因,但Python是一种非常高级的语言。与C或C++这样的语言相比,它要经过更多的层才能到达硬件。Python本身实际上是用C编写的。
另一个原因是,是的,它是被解释的,因此对硬件的所有处理也必须即时完成,而不是在编写C++程序并编译之后才会被解析并准备就绪。
null