log_utils 打印日志
报错截图

修改后,如下:
python
import os # 新增:用于路径处理
from functools import wraps
import time
import gc # 新增
# 兼容CuPy/NumPy
try:
import cupy as xp
except ImportError:
import numpy as xp
def format_value(val):
# 1. 处理CuPy/NumPy数组
if isinstance(val, xp.ndarray):
# 计算大小
size_mb = val.nbytes / (1024 ** 2)
# 关键修改:大数组不切片!
if size_mb > 100: # >100MB
return f"ndarray(dtype={val.dtype}, shape={val.shape}) <{size_mb:.0f}MB>"
elif val.ndim >= 2:
return f"ndarray(dtype={val.dtype}, shape={val.shape})"
else:
val_str = str(val[:3]).replace('\n', '')
return f"ndarray(dtype={val.dtype}, shape={val.shape}, val={val_str})"
# 2. 处理纯数字
elif isinstance(val, (int, float, complex)):
return f"{type(val).__name__}({val})"
# 3. 处理列表/元组
elif isinstance(val, (list, tuple)):
formatted_items = [format_value(item) for item in val[:2]]
return f"{type(val).__name__}(len={len(val)}, items={formatted_items})"
# 4. 其他类型
else:
return f"{type(val).__name__}({str(val)[:50]})"
def auto_log(func):
@wraps(func)
def wrapper(*args, **kwargs):
func_name = func.__name__
start_time = time.strftime('%H:%M:%S')
# 关键:执行前清理内存
gc.collect()
# 格式化入参
formatted_args = [format_value(arg) for arg in args]
formatted_kwargs = {k: format_value(v) for k, v in kwargs.items()}
# 打印开始日志
print(f"\n[{start_time}] 🚀 {func_name} - 开始执行")
print(f" → 入参(args):{formatted_args}")
print(f" → 入参(kwargs):{formatted_kwargs}")
# 执行原方法
result = func(*args, **kwargs)
# 格式化返回值
formatted_result = format_value(result)
end_time = time.strftime('%H:%M:%S')
# 打印结束日志
print(f"[{end_time}] ✅ {func_name} - 完成执行")
print(f" → 返回值:{formatted_result}")
# 关键:执行后清理内存
gc.collect()
return result
return wrapper