Python中如何像计时一样简便测量函数执行的内存占用?
Python函数内存占用测量的简便方法
当然有啦!就像你用timeit来统计函数执行时间那样,Python里也有不少简便的工具可以帮你测量函数运行时的内存占用,还能像存计时结果一样把内存数据存进列表里~
方法一:用memory_profiler(第三方库,功能丰富)
这个库用法和timeit一样直观,还能给出函数执行过程中的内存变化细节,先安装它:
pip install memory-profiler
下面是和你计时逻辑对应的示例代码,能同时记录耗时和内存占用并存入列表:
from memory_profiler import memory_usage from timeit import default_timer as timer import random # 模拟你的随机数据生成函数 def getRand(k, randStart, randDivisor): return [random.uniform(randStart, k/randDivisor) for _ in range(k)] # 模拟你要测试的业务函数 def your_target_function(data): # 这里替换成你实际的函数逻辑 processed_data = [x * 2 for x in data] return processed_data # 用来存储结果的列表 memoryPerTenRuns = [] timePerTenRuns = [] numRuns = [10, 20, 30] # 你的测试次数列表 for run_count in numRuns: # 生成随机测试数据 randList = getRand(1000, 0, 2) # 计时+测内存 start = timer() # memory_usage接收(函数, 参数元组),返回执行过程中内存采样的列表 mem_samples = memory_usage((your_target_function, (randList,))) end = timer() # 记录耗时和内存峰值(也可以用sum(mem_samples)/len(mem_samples)取平均值) timePerTenRuns.append(end - start) memoryPerTenRuns.append(max(mem_samples)) print("每次运行耗时:", timePerTenRuns) print("每次运行内存峰值(MB):", memoryPerTenRuns)
如果需要看每行代码的内存占用,可以给函数加上@profile装饰器,然后用命令python -m memory_profiler your_script.py运行,就能得到逐行的内存统计啦。
方法二:用tracemalloc(Python标准库,无需额外安装)
如果你不想装第三方库,Python自带的tracemalloc模块完全能满足基础的内存测量需求,用法同样简单:
import tracemalloc from timeit import default_timer as timer import random def getRand(k, randStart, randDivisor): return [random.uniform(randStart, k/randDivisor) for _ in range(k)] def your_target_function(data): processed_data = [x * 2 for x in data] return processed_data memoryPerTenRuns = [] timePerTenRuns = [] numRuns = [10, 20, 30] for run_count in numRuns: randList = getRand(1000, 0, 2) start = timer() # 启动内存追踪 tracemalloc.start() your_target_function(randList) # 获取当前内存和峰值(单位:字节) current_mem, peak_mem = tracemalloc.get_traced_memory() tracemalloc.stop() end = timer() timePerTenRuns.append(end - start) # 转换为MB更易读 memoryPerTenRuns.append(peak_mem / 10**6) print("每次运行耗时:", timePerTenRuns) print("每次运行内存峰值(MB):", memoryPerTenRuns)
这个方法的优势是无需额外依赖,适合轻量场景,get_traced_memory()直接返回运行过程中的内存峰值,非常方便。
内容的提问来源于stack exchange,提问作者R. Anstotz
相关产品推荐
相关产品推荐

