ztxexp.utils¶
ztxexp.utils
¶
通用工具函数集合。
该模块被 manager/runner/analyzer 等核心组件复用,设计原则: 1. 纯工具、低耦合; 2. 尽量无全局副作用; 3. 对可选依赖提供明确错误提示。
add_to_sys_path
¶
将目录加入 sys.path(若尚未存在)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
path
|
str | Path
|
目标目录。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
示例:
源代码位于: ztxexp/utils.py
append_jsonl
¶
向 JSONL 文件追加一条记录。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
JSONL 文件路径。 |
必需 |
record
|
dict[str, Any]
|
单条记录字典。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
示例:
源代码位于: ztxexp/utils.py
as_plain_dict
¶
将常见配置对象统一转换为普通字典。
支持输入类型:
1. Mapping:返回深拷贝字典;
2. dataclass 实例:使用 dataclasses.asdict;
3. 具有 __dict__ 的对象(如 argparse.Namespace)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
value
|
Any
|
待转换对象。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
dict[str, Any]: 转换后的普通字典。 |
引发:
| 类型 | 描述 |
|---|---|
TypeError
|
输入对象不支持转换时抛出。 |
示例:
源代码位于: ztxexp/utils.py
build_run_name
¶
build_run_name(config: Mapping[str, Any], keys: Sequence[str] | None = None, prefix: str = 'run', max_length: int = 120, hash_length: int = 8) -> str
根据配置生成稳定且可读的 run 名称。
命名格式:{prefix}_{k1}-{v1}_{k2}-{v2}_..._{hash}。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
config
|
Mapping[str, Any]
|
配置字典。 |
必需 |
keys
|
Sequence[str] | None
|
参与命名的键序列;为 |
None
|
prefix
|
str
|
名称前缀。 |
'run'
|
max_length
|
int
|
最大长度,超长会截断(仍保留末尾哈希)。 |
120
|
hash_length
|
int
|
配置哈希长度。 |
8
|
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
适合目录名/文件名的 run 名称。 |
示例:
>>> build_run_name({"model": "tiny", "lr": 0.001}, keys=["model", "lr"])
'run_model-tiny_lr-0.001_...'
源代码位于: ztxexp/utils.py
config_to_hash
¶
将配置字典映射为稳定短哈希。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
config
|
dict[str, Any]
|
配置字典。 |
必需 |
length
|
int
|
截断长度。 |
8
|
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
SHA256 前缀。 |
示例:
源代码位于: ztxexp/utils.py
create_dir
¶
deep_merge_dicts
¶
递归合并两个字典并返回新字典。
合并规则:
1. 若同名键在两侧均为字典,则递归合并;
2. 否则使用 override 覆盖 base。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
base
|
Mapping[str, Any]
|
基础字典。 |
必需 |
override
|
Mapping[str, Any]
|
覆盖字典。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
dict[str, Any]: 合并后的新字典(不会原地修改输入)。 |
示例:
源代码位于: ztxexp/utils.py
delete_dir
¶
删除目录及其全部内容。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
path
|
str | Path
|
目标目录路径。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
dict_diff
¶
比较两个字典差异并返回结构化结果。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
left
|
Mapping[str, Any]
|
左侧字典(通常视作“旧值”)。 |
必需 |
right
|
Mapping[str, Any]
|
右侧字典(通常视作“新值”)。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
dict[str, Any]:
结构为 |
示例:
源代码位于: ztxexp/utils.py
flatten_dict
¶
将嵌套字典扁平化为单层字典。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
data
|
Mapping[str, Any]
|
输入嵌套字典。 |
必需 |
parent_key
|
str
|
父级前缀键,通常由递归内部使用。 |
''
|
sep
|
str
|
键路径分隔符。 |
'.'
|
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
dict[str, Any]: 扁平化结果。示例: |
示例:
>>> flatten_dict({"model": {"name": "tiny", "layers": 12}})
{'model.name': 'tiny', 'model.layers': 12}
源代码位于: ztxexp/utils.py
format_time_delta
¶
将秒数格式化为 Hh Mm Ss。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
seconds
|
float
|
总秒数。 |
必需 |
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
例如 |
源代码位于: ztxexp/utils.py
get_file_creation_time
¶
获取文件创建时间字符串。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
文件路径。 |
必需 |
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
格式为 |
源代码位于: ztxexp/utils.py
get_memory_usage
¶
获取当前进程内存占用。
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
形如 |
get_subdirectories
¶
获取路径下的一级子目录列表。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
path
|
str | Path
|
目标路径。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
list[Path]
|
list[pathlib.Path]: 一级子目录列表;不存在时返回空列表。 |
源代码位于: ztxexp/utils.py
load_dill
¶
从 dill 文件反序列化对象。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
输入路径。 |
必需 |
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
object |
object
|
反序列化后的对象。 |
load_json
¶
读取 JSON 字典文件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
文件路径。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any] | None
|
dict[str, Any] | None: - 文件存在且顶层为 dict 时返回字典; - 文件不存在或顶层非 dict 时返回 None。 |
源代码位于: ztxexp/utils.py
load_jsonl
¶
读取 JSONL 文件为记录列表。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
JSONL 文件路径。 |
必需 |
skip_invalid
|
bool
|
为 |
False
|
返回:
| 类型 | 描述 |
|---|---|
list[dict[str, Any]]
|
list[dict[str, Any]]: 记录列表。不存在时返回空列表。 |
引发:
| 类型 | 描述 |
|---|---|
JSONDecodeError
|
|
ValueError
|
存在顶层非 dict 的合法 JSON 行时抛出。 |
源代码位于: ztxexp/utils.py
load_torch_model
¶
load_torch_model(model: Any, optimizer: Any | None, path: str | Path) -> tuple[Any, Any | None, int]
加载 PyTorch checkpoint。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
model
|
Any
|
|
必需 |
optimizer
|
Any | None
|
|
必需 |
path
|
str | Path
|
checkpoint 路径。 |
必需 |
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
tuple |
tuple[Any, Any | None, int]
|
|
源代码位于: ztxexp/utils.py
pretty_print_dict
¶
美观打印字典。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
d
|
dict[str, Any]
|
目标字典。 |
必需 |
items_per_line
|
int
|
每行展示的键值对数量。 |
3
|
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
源代码位于: ztxexp/utils.py
pretty_print_namespace
¶
美观打印 Namespace。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
args
|
Any
|
|
必需 |
items_per_line
|
int
|
每行展示的键值对数量。 |
3
|
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
源代码位于: ztxexp/utils.py
retry_call
¶
retry_call(fn: Callable[..., Any], *args: Any, max_attempts: int = 3, wait_sec: float = 0.0, backoff: float = 1.0, jitter_sec: float = 0.0, retry_exceptions: tuple[type[BaseException], ...] = (Exception,), **kwargs: Any) -> Any
按可配置策略重试执行函数。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
fn
|
Callable[..., Any]
|
目标函数。 |
必需 |
*args
|
Any
|
目标函数位置参数。 |
()
|
max_attempts
|
int
|
最大尝试次数(至少为 1)。 |
3
|
wait_sec
|
float
|
初始等待秒数。 |
0.0
|
backoff
|
float
|
每次失败后的等待放大倍率。 |
1.0
|
jitter_sec
|
float
|
每次等待的随机抖动上限(秒)。 |
0.0
|
retry_exceptions
|
tuple[type[BaseException], ...]
|
触发重试的异常类型元组。 |
(Exception,)
|
**kwargs
|
Any
|
目标函数关键字参数。 |
{}
|
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
Any |
Any
|
目标函数返回值。 |
引发:
| 类型 | 描述 |
|---|---|
Exception
|
超过最大重试次数后,抛出最后一次异常。 |
ValueError
|
配置参数非法时抛出。 |
示例:
>>> state = {"n": 0}
>>> def flaky():
... state["n"] += 1
... if state["n"] < 2:
... raise RuntimeError("retry")
... return "ok"
>>> retry_call(flaky, max_attempts=3)
'ok'
源代码位于: ztxexp/utils.py
sanitize_filename
¶
将字符串清洗为跨平台较安全的文件名。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str
|
原始文件名文本。 |
必需 |
replacement
|
str
|
非法字符替换符。 |
'_'
|
max_length
|
int
|
返回文件名最大长度(最小为 1)。 |
128
|
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
str |
str
|
清洗后的文件名。 |
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
当 |
示例:
源代码位于: ztxexp/utils.py
save_dill
¶
使用 dill 序列化对象到文件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
obj
|
object
|
任意 Python 对象。 |
必需 |
file_path
|
str | Path
|
输出路径。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
源代码位于: ztxexp/utils.py
save_json
¶
保存字典为 JSON 文件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
data
|
dict[str, Any]
|
目标字典。 |
必需 |
file_path
|
str | Path
|
输出路径。 |
必需 |
indent
|
int
|
缩进空格数。 |
2
|
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
源代码位于: ztxexp/utils.py
save_json_atomic
¶
以原子方式写入 JSON 文件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
data
|
dict[str, Any]
|
待保存字典。 |
必需 |
file_path
|
str | Path
|
输出路径。 |
必需 |
indent
|
int
|
JSON 缩进空格。 |
2
|
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
示例:
源代码位于: ztxexp/utils.py
save_torch_model
¶
保存 PyTorch checkpoint。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
model
|
Any
|
|
必需 |
optimizer
|
Any | None
|
|
必需 |
epoch
|
int
|
当前训练轮数。 |
必需 |
path
|
str | Path
|
输出路径。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
源代码位于: ztxexp/utils.py
setup_logger
¶
创建或复用日志器(文件 + 控制台)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str
|
logger 名称。 |
必需 |
log_file
|
str | Path
|
文件日志路径。 |
必需 |
level
|
int
|
日志级别。 |
INFO
|
返回:
| 类型 | 描述 |
|---|---|
Logger
|
logging.Logger: 配置完成的 logger。 |
Notes
同名 logger 若已存在 handler,则直接复用,避免重复输出。
源代码位于: ztxexp/utils.py
split_batches
¶
按固定批大小切分序列。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
items
|
Sequence[Any]
|
输入序列。 |
必需 |
batch_size
|
int
|
单批大小,必须大于 0。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
list[list[Any]]
|
list[list[Any]]: 批次列表。输入为空时返回空列表。 |
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
当 |
示例:
源代码位于: ztxexp/utils.py
timer
¶
计时代码块。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str
|
计时标签。 |
必需 |
logger
|
Logger | None
|
可选日志器。为空则打印到标准输出。 |
None
|
产生:
| 类型 | 描述 |
|---|---|
None
|
None |
示例:
源代码位于: ztxexp/utils.py
unflatten_dict
¶
将扁平字典还原为嵌套字典。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
data
|
Mapping[str, Any]
|
扁平字典。键可包含路径分隔符,例如 |
必需 |
sep
|
str
|
键路径分隔符。 |
'.'
|
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
dict[str, Any]: 还原后的嵌套字典。 |
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
当路径冲突(同一路径既是值又是父节点)时抛出。 |
示例:
>>> unflatten_dict({"model.name": "tiny", "model.layers": 12})
{'model': {'name': 'tiny', 'layers': 12}}
源代码位于: ztxexp/utils.py
utc_now_iso
¶
write_text_atomic
¶
以原子方式写入文本文件,避免写入中断导致半文件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
file_path
|
str | Path
|
目标文件路径。 |
必需 |
text
|
str
|
文本内容。 |
必需 |
encoding
|
str
|
文本编码。 |
'utf-8'
|
返回:
| 类型 | 描述 |
|---|---|
None
|
None |
Notes
实现方式为“同目录临时文件写入完成后 os.replace 覆盖目标”。