Your Site Title

python profiler

py-spy cpu profiler

py-spy top --pid 255

tracemalloc

1. 基础用法:查看内存增长最多的地方

tracemalloc.start()  # 开启内存跟踪

def my_function():
    data = [x for x in range(1000000)]  # 生成大量数据
    return data

my_function()

# 获取当前内存快照
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')  # 按行统计

print("[Top 10 内存占用最多的代码行]")
for stat in top_stats[:10]:
    print(stat)

2. 追踪单个变量的内存占用

import tracemalloc
import sys

tracemalloc.start()

data = [x for x in range(1000000)]
print(f"变量 data 内存占用: {sys.getsizeof(data) / 1024:.2f} KB")

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

for stat in top_stats[:5]:  # 仅显示前5个占用大的
    print(stat)

3. 监控整个程序的内存增长

tracemalloc.start()

def load_data():
    data = [x for x in range(1000000)]
    return data

snapshot1 = tracemalloc.take_snapshot()  # 记录快照 1
data = load_data()
snapshot2 = tracemalloc.take_snapshot()  # 记录快照 2

# 对比快照 stats = snapshot2.compare_to(snapshot1, ‘lineno’)

print("[内存增长最多的代码行]")
for stat in stats[:5]:  # 仅显示前 5 个
    print(stat)

4. 追踪哪些函数占用了最多的内存

import tracemalloc

tracemalloc.start()

def create_big_data():
    return [x for x in range(1000000)]

def process_data():
    data = create_big_data()
    return [x * 2 for x in data]

process_data()

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')  # 按调用栈统计

print("[最耗内存的调用栈]")
for stat in top_stats[:3]:  # 仅显示前3个
    print("\n".join(stat.traceback.format()))
    print(f"占用: {stat.size / 1024:.2f} KB")



def log_memory_snapshot(stage: str):
    process = psutil.Process(os.getpid())
    mem_mb = process.memory_info().rss / 1024 / 1024
    print(f"[MEMORY] {stage} - RSS: {mem_mb:.2f} MB")

    current, peak = tracemalloc.get_traced_memory()
    print(f"[TRACEMALLOC] {stage} - Current: {current / 1024 / 1024:.2f} MB, Peak: {peak / 1024 / 1024:.2f} MB")

pympler 变量内存

from pympler import asizeof
print(asizeof.asizeof(x))

memory_profiler

from memory_profiler import profile
@profile
def foo():
    x = {...}
    print("x size:", asizeof.asizeof(x))

Reference