Performance regression of pathlib.Path hashing
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
Converting a list of pathlib.Path objects to a set() takes significantly more time in python 3.12 and beyond compared to 3.11.
The below code is a minimal reproduction:
from pathlib import Path
import time
import sys
print(sys.version)
# make 6000 paths as a string
paths_str = ["/tmp/foo/bar/{i}" for i in range(1000, 7000)]
t = time.perf_counter()
# convert it to a list of Path objects
paths_path = [Path(path) for path in paths_str]
elapsed = time.perf_counter() - t
print(f"List construct: {int(elapsed * 1000)} msec")
# convert list to set
t = time.perf_counter()
set(paths_path)
elapsed = time.perf_counter() - t
print(f"Set conversion: {int(elapsed * 1000)} msec")
# extra step: convert list to set (demonstrate caching makes it faster)
t = time.perf_counter()
set(paths_path)
elapsed = time.perf_counter() - t
print(f"Set conversion (cached): {int(elapsed * 1000)} msec")
It shows with 3.12:
3.12.11 (main, Jun 3 2025, 15:41:47) [GCC 14.3.0]
List construct: 5 msec
Set conversion: 28 msec
Set conversion (cached): 1 msec
With 3.14rc1 (similar):
3.14.0rc1 (main, Jul 22 2025, 16:42:44) [GCC 14.3.0]
List construct: 4 msec
Set conversion: 26 msec
Set conversion (cached): 1 msec
But with python 3.11 (faster):
3.11.13 (main, Jun 3 2025, 18:38:25) [GCC 14.3.0]
List construct: 12 msec
Set conversion: 8 msec
Set conversion (cached): 1 msec
I also found that not only hash() got worse but str() as well - if you replace the set() call with a [str(p) for p in paths_path].
I found a possible candidate for this issue, but that's more just a theory, I could not test it:
https://github.com/python/cpython/commit/a68e585c8b7b27323f67905868467ce0588a1dae
Could you please check what causes this?
I think newer python versions should not make the code slower, pathlib.Path is a great object (much superior than str) and now using lots of paths with a set or dict (which are also powerful data structures) kills the performance.
If you need any help, let me know.
Thank you,
Zsolt
CPython versions tested on:
3.12
Operating systems tested on:
Linux
Linked PRs
- gh-138645
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从报告的 pathlib.Path 基准测试开始,比较 Python 3.11、3.12 和 3.14 中的 hashing 与字符串转换。检查疑似提交 a68e585c8b7b27323f67905868467ce0588a1dae 以及关联的 PR gh-138645。完成的标准是确定回归问题,并恢复 set、hash 和字符串转换的可比性能。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- performance
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 25/100