如何降低Python脚本内存占用?以LeetCode三数之和问题为例
LeetCode 三数之和:内存超限问题的解决思路
我在解决LeetCode的三数之和问题时,代码能正常运行但触发了内存限制。试过减少变量数量,但效果不佳,想了解这类内存超限问题的解决思路。
我的实现代码:
class Solution(object): def threeSum(self, nums): duos = {} triple = {} for num1 in nums: del nums[nums.index(num1)] for num2 in nums : duos[tuple([num1,num2])] = num1 + num2 nums.insert(0, num1) for duo in duos: del nums [nums.index(duo[0])] del nums [nums.index(duo[-1])] for num in nums: if duo[0] + duo[-1] + num == 0: x = [duo[0],duo[-1],num] x.sort() triple[tuple(x)] = 1 nums.insert(0,duo[0]) nums.insert(0,duo[-1]) return triple
问题根源分析
你的代码内存超限的核心原因是预存了所有可能的二元组:
- 当输入数组长度为n时,
duos字典会存储O(n²)个键值对,比如n=1000时,就会有近100万条记录,直接占满内存。 - 频繁对原数组执行
del和insert操作,会导致列表频繁重新分配内存,增加额外的内存开销。 - 用字典
triple存储结果去重,虽然能达到目的,但也额外占用了不少内存。
内存优化核心思路
1. 放弃预存中间结果,改用实时遍历
不要提前把所有二元组都存起来,而是通过更高效的算法(比如排序+双指针)在遍历过程中直接寻找符合条件的三元组,完全避免O(n²)级别的内存占用。
2. 排序后直接去重,替代字典去重
排序后可以通过跳过重复元素的方式实现去重,不需要用字典存储结果,减少内存开销。
3. 避免修改原数组,改用索引遍历
原代码中删除、插入数组元素的操作既低效又浪费内存,直接用索引遍历排序后的数组即可。
优化后的代码示例
class Solution(object): def threeSum(self, nums): nums.sort() result = [] n = len(nums) for i in range(n): # 跳过重复的第一个元素,避免生成重复三元组 if i > 0 and nums[i] == nums[i-1]: continue left = i + 1 right = n - 1 target = -nums[i] while left < right: current_sum = nums[left] + nums[right] if current_sum == target: result.append([nums[i], nums[left], nums[right]]) # 跳过left指针的重复元素 while left < right and nums[left] == nums[left+1]: left += 1 # 跳过right指针的重复元素 while left < right and nums[right] == nums[right-1]: right -= 1 # 移动指针寻找下一组可能 left += 1 right -= 1 elif current_sum < target: left += 1 else: right -= 1 return result
通用内存超限问题解决思路
- 定位内存大户:先找到代码中占用内存最多的对象(比如你的
duos字典),这是优化的核心目标。 - 削减冗余存储:避免预存所有可能的中间结果,尽量实时计算,尤其是当数据量达到平方级或更高时。
- 换用低内存算法:很多时候内存超限是因为算法复杂度太高,比如用O(n²)的暴力枚举换成O(n²)时间但O(1)额外空间的双指针法(排序的空间开销可以忽略)。
- 优化数据结构:用更节省内存的结构,比如用列表存储结果代替字典去重,用原地操作减少内存分配。
内容的提问来源于stack exchange,提问作者levlevon
相关产品推荐
相关产品推荐

