如何在Python中测量代码各部分(如循环)的RAM占用并设置阈值中断?
解决方案
要实现特定代码段(比如每个for循环)的内存监控、阈值中断和用量统计,你可以基于psutil扩展实现——核心思路是记录代码段执行前的内存基线,实时计算当前内存与基线的差值,以此得到该代码段的内存增量。以下是完整的可运行方案:
步骤说明
- 先获取进程初始内存作为基线,每次循环操作后计算内存增量,判断是否超过阈值
- 内存单位统一转换为MB(方便和1GB=1024MB的阈值对比)
- 封装内存获取逻辑为函数,简化代码复用
完整代码示例
import psutil import os def get_current_memory_mb(): """获取当前进程的内存占用(单位:MB)""" process = psutil.Process(os.getpid()) return process.memory_info().rss / (1024 * 1024) # 初始化字典 dict1 = {} dict2 = {} dict3 = {} # 监控第一个循环 print("=== 监控第一个循环 ===") base_memory = get_current_memory_mb() loop1_used_max = 0 for i in range(200): # 模拟填充dict1的操作(可替换为你的实际逻辑) dict1[i] = str(i) * 100000 current_memory = get_current_memory_mb() loop_used = current_memory - base_memory # 更新该循环的最大内存占用 if loop_used > loop1_used_max: loop1_used_max = loop_used # 判断是否超过1GB阈值 if loop_used > 1024: print(f"第一个循环内存占用超过1GB,已中断。当前使用: {loop_used:.2f} MB") break else: # 循环正常结束(未触发break) print(f"第一个循环正常完成,最大内存使用: {loop1_used_max:.2f} MB") # 监控第二个循环 print("\n=== 监控第二个循环 ===") base_memory = get_current_memory_mb() loop2_used_max = 0 for i in range(500): dict2[i] = str(i) * 150000 current_memory = get_current_memory_mb() loop_used = current_memory - base_memory if loop_used > loop2_used_max: loop2_used_max = loop_used if loop_used > 1024: print(f"第二个循环内存占用超过1GB,已中断。当前使用: {loop_used:.2f} MB") break else: print(f"第二个循环正常完成,最大内存使用: {loop2_used_max:.2f} MB") # 监控第三个循环 print("\n=== 监控第三个循环 ===") base_memory = get_current_memory_mb() loop3_used_max = 0 for i in range(800): dict3[i] = str(i) * 200000 current_memory = get_current_memory_mb() loop_used = current_memory - base_memory if loop_used > loop3_used_max: loop3_used_max = loop_used if loop_used > 1024: print(f"第三个循环内存占用超过1GB,已中断。当前使用: {loop_used:.2f} MB") break else: print(f"第三个循环正常完成,最大内存使用: {loop3_used_max:.2f} MB")
关键细节解释
- 内存基线的作用:每个循环开始前记录
base_memory,后续计算的loop_used = 当前内存 - 基线就是该循环单独占用的内存增量,排除了进程其他部分的内存消耗。 - 实时监控与阈值判断:每次循环迭代后都检查内存增量,一旦超过1024MB(1GB)就立即中断循环。
- 最大内存统计:记录循环执行过程中的最大内存增量,能准确反映该循环的峰值内存占用。
- 循环else分支:当循环正常完成(未触发break)时,输出正常完成的提示和最大内存使用量。
内容的提问来源于stack exchange,提问作者Orca
相关产品推荐
相关产品推荐

