Slow inspect.getmodule
未關閉
還沒有人認領這個 Issue。
3.12
performance
stdlib
type-bug
- 主要語言
- Python
- 星號
- 77.2k
- 分支
- 36k
- PR 合併指標
- PR 指標待擷取
描述
Bug report
inspect.getmodule is slow. It becomes slower as len(sys.modules) grows. It is slower with modules that don't resolve to valid file paths. This causes inspect.stack and others to be slow as well.
def run_test(module):
# cols have stack depths
# rows have len(sys.modules)
def print_line(h, *vals):
if not h:
print("%5s" % h, *["%6i" % v for v in vals])
else:
print("%5s" % h, *["%6.1f" % v for v in vals])
def add_modules(n):
import random
import sys
for _ in range(n):
sys.modules[f"foo_{random.randint(0,2**64)}"] = module
def measure(depth):
import inspect
import timeit
def nest(level):
if level > 0:
return nest(level-1)
else:
dur = timeit.timeit(lambda: inspect.stack(), number=1)
return dur * 1000
return nest(depth)
import sys
print_line("", *[2**e for e in range(7)])
for i in range(1, 5):
add_modules(n=10**i)
times = [measure(depth=2**e) for e in range(7)]
print_line(len(sys.modules), *times)
python 3.11.0a7+ optimized build ====
# sys has no __file__ and doesn't enter getmodule cache
>>> import sys
>>> run_test(sys)
1 2 4 8 16 32 64
87 2.1 0.8 1.0 1.3 2.0 3.3 6.1
187 2.0 2.5 2.7 3.6 5.5 9.5 16.8
1187 13.6 15.7 19.1 26.3 39.6 67.4 123.3
11187 134.1 150.3 183.4 252.0 383.5 750.3 1189.8
>>> exit()
>>> import random
>>> run_test(random)
1 2 4 8 16 32 64
87 2.1 0.7 0.9 1.2 1.7 2.9 5.6
187 2.3 1.1 1.5 1.8 2.5 4.3 7.8
1187 17.0 4.3 5.6 7.1 11.1 18.6 33.9
11187 164.6 37.4 45.7 61.6 94.7 161.0 297.7
>>> exit()
Tables show time in milliseconds for a single inspect.stack() call.
Rows show len(sys.modules)
Columns indicate stack depth
Your environment
- CPython versions tested on: 3.9, 3.11.0a7+
- Operating system and architecture: MacOS, Linux, x64
- PR: gh-92042
- PR: gh-154403
- PR: gh-156685
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
先閱讀 inspect.getmodule 和 inspect.stack 的實作,然後在逐步增加 sys.modules 大小和堆疊深度的情況下重現提供的 benchmark。在進行變更之前,先檢視所參照的 PR:gh-92042、gh-154403 和 gh-156685;當回報的擴充性問題獲得解決,且 benchmark 或相關測試顯示出改善時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- python
- 領域
- tooling
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 需要釐清
- 新手友好度
- 20/100