List python声明大型二维数组的方式是否比c++;?
最初的leetcode问题是: 最长回文子串 给定一个字符串S,查找S中最长的回文子串。您可以假设S的最大长度为1000,并且存在一个唯一的最长回文子串 我用python编程,使用2d DP方式,总是超过时间限制。虽然用Cpp实现了相同的想法,但很容易就通过了 我花了几个小时在这上面,python中的响应部分是什么 与Cpp相比,成本较高 我搜索了一下,确信reversed()是安全的,它不会复制。我正在考虑这是否是由python声明dp矩阵的方式引起的? 任何人都能看出python版本中的错误 蟒蛇List python声明大型二维数组的方式是否比c++;?,list,runtime,List,Runtime,最初的leetcode问题是: 最长回文子串 给定一个字符串S,查找S中最长的回文子串。您可以假设S的最大长度为1000,并且存在一个唯一的最长回文子串 我用python编程,使用2d DP方式,总是超过时间限制。虽然用Cpp实现了相同的想法,但很容易就通过了 我花了几个小时在这上面,python中的响应部分是什么 与Cpp相比,成本较高 我搜索了一下,确信reversed()是安全的,它不会复制。我正在考虑这是否是由python声明dp矩阵的方式引起的? 任何人都能看出python版本中的错误
class Solution:
# @param s, a string
# @return a string
def longestPalindrome(self, s):
st = 0
maxl = 0
dp = [[False]*1000 for i in xrange(1000)]
for i in reversed(xrange(len(s))):
for j in xrange(i,len(s)):
if s[i] == s[j] and (i+1>j-1 or dp[i+1][j-1] ):
dp[i][j] = True
if j-i+1 > maxl:
st = i
maxl = j-i+1
return s[st:st+maxl]
C++
类解决方案{
公众:
字符串最长回文(字符串s){
int start=0,maxLen=1,n=s.size();
bool isPal[1000][1000]={false};
对于(int i=n-1;i>=0;i--){
对于(int j=i;jj-1 | isPal[i+1][j-1])和&s[i]==s[j]){
isPal[i][j]=真;
如果(j-i+1>maxLen){
maxLen=j-i+1;
开始=i;
}
}
}
}
返回s.substr(开始,最大值);
}};
来自scipy邮件列表
“比较操作对于一般Python对象来说可能非常昂贵,而对于数值数组来说,比较操作相对来说非常便宜”
如果您想要更好的性能,请使用专用的数字库,如/
如果您想要一个关于Python性能的更深入的答案,而不是一种编译语言,那么您可能需要一个关于Python内部或其解释器的单独问题
顺便说一句,你不需要在你的文件中的def函数之前缩进吗
这回答了完整代码的性能问题。如果您想确切地了解Python中内存分配的性能,那么只测试代码中的专用部分,并编写它是否工作
另一种提高性能的方法是使用Cython。是对Python开销与C相比的详细描述。感谢您的回答。基本上我的问题应该是:下面的代码行:“Pd= [[Falc] 1000,i在xLead(1000)]中,Python是一个昂贵的方式来定义一个2维列表,与C++或java中的2维数组声明相比较。因为我看到很多人在抄袭there@shiyuDong-我想你保留名单的权利。主要缺点是在您的周期内(应该使用其他方法解决,而不是直接使用语言的方法)。对不起,如果我的回答不够直截了当。另外,是的,Python中的几乎所有东西都比C++更昂贵,因为它们是非常不同的语言W.R.T性能。
class Solution {
public:
string longestPalindrome(string s) {
int start = 0, maxLen = 1, n = s.size();
bool isPal[1000][1000] = {false};
for(int i=n-1; i>=0; i--) {
for(int j=i; j<n; j++) {
if((i+1>j-1 || isPal[i+1][j-1]) && s[i]==s[j]) {
isPal[i][j] = true;
if(j-i+1>maxLen) {
maxLen = j-i+1;
start = i;
}
}
}
}
return s.substr(start,maxLen);
}};