Python刷LeetCode时,同一段代码用Python通过但用Python3超时,这段代码有什么问题吗?
rt 附上代码,求大神解答。
class Solution:
# @return a list of lists of length 3, [[val1,val2,val3]]
def threeSum(self, num):
num.sort()
res = []
for i in range(len(num)-2):
if i == 0 or num[i] > num[i-1]:
left = i + 1
right = len(num) - 1
while left < right:
if num[left] + num[right] == -num[i]:
res.append([num[i], num[left], num[right]])
left += 1
right -= 1
while left < right and num[left] == num[left-1]:
left += 1
while left < right and num[right] == num[right+1]:
right -= 1
elif num[left] + num[right] < -num[i]:
while left < right:
left += 1
if num[left] > num[left-1]:
break
else:
while left < right:
right -= 1
if num[right] < num[right+1]:
break
return res
Python刷LeetCode时,同一段代码用Python通过但用Python3超时,这段代码有什么问题吗?
按代码格式贴吧
你遇到的这个问题很典型,核心原因通常是Python 2和Python 3在某些内置函数或标准库的实现上有性能差异,或者你的代码无意中依赖了Python 2的某些“更快”但已过时的行为。
最常见的原因是输入读取效率。在Python 3中,input()函数就是Python 2中的raw_input(),它返回字符串。但很多人在Python 2里习惯用input(),它实际上会eval()读取的内容,这有时“显得”更快,但在Python 3里这不再是问题,真正的问题在于数据量大的时候怎么读。
给你看个对比。假设题目需要读取大量整数,很多人这样写:
# 可能导致Python 3超时的写法 (尤其在数据量大时)
n = int(input())
data = list(map(int, input().split()))
在Python 3里,input()每次调用都有开销。数据量巨大时(比如10^5行),用sys.stdin.read()或sys.stdin.buffer直接处理字节流会快一个数量级。
修复方案:统一使用高速输入。
import sys
def main():
# 一次读取所有输入,按需处理
data = sys.stdin.buffer.read().split()
# 如果需要第一个数为n
n = int(data[0])
# 其余部分转为整数列表
arr = list(map(int, data[1:1+n]))
# ... 你的算法逻辑
if __name__ == "__main__":
main()
另一个可能原因是字典迭代。Python 2的dict.keys()返回列表,Python 3返回视图。如果你写了for key in some_dict.keys():,在Python 3里没问题,但如果你在循环里又修改了字典,或者在Python 2时代码有别的隐藏问题,升级后可能暴露。
总结建议:优先检查输入输出部分,换成sys.stdin.buffer。
感觉是 range 函数的问题吧,2.7 中 range 函数是先在内存中生成整个列表再遍历的,缺点是占内存,但是效率高,在 3 中 range 函数是一个生成器,内存占用小,但是效率低一点
楼主可以在 2.7 版本中将 range 改成 xrang 试试会不会超时,如果超时基本可以确定是这个问题了
Python3.6 版本性能才赶得上 Python2.7,估计是 Python3 版本问题

