Skip to content

pytest 慢:autouse fixture 每个测试清空 numba kernel 缓存导致全量重编 #32

Description

@wlgys8

问题

motrix_env_core/tests/test_numba_manager.py 跑一次约 26~31s(28 个测试),其中绝大多数时间花在重复编译 Numba kernel 上。

根因

test_numba_manager.py:286-290 的 autouse fixture:

@pytest.fixture(autouse=True)
def _isolated_numba_cache(tmp_path, monkeypatch):
    monkeypatch.setenv("NUMBA_CACHE_DIR", str(tmp_path / "numba-cache"))
    compiler_module._KERNEL_CACHE.clear()
    compiler_module._TERM_CACHE.clear()

它对所有测试生效:

  • 每个测试前清空进程内 _KERNEL_CACHE / _TERM_CACHE,框架自带的同 plan 去重被完全绕过;
  • NUMBA_CACHE_DIR 指向每个测试独立的空 tmp 目录,磁盘缓存也无法命中。

结果:28 个测试每个都全额重编。日志确认同一 plan_key 在不同测试中各编译一次(每个 ~1.2s)。

证据

进程内缓存正常工作时(脚本直接连续构造同配置 env):

构造次序 init_state 耗时
第 1 个 env(含编译) 1.52s
第 2~4 个 env ~0ms

pytest 中因 autouse 清缓存,每个测试固定 1.2~1.5s:

1.53s call     test_step_preserves_previous_observation_with_alternating_preallocated_buffers
1.48s call     test_done_envs_reset_before_observation_and_preserve_transition_outputs
1.39s call     test_command_term_updates_lifecycle_and_selected_reset_ids
...
28 passed in 30.76s   # 冷跑
28 passed in 25.67s   # 热跑,磁盘缓存同样无效

建议修复

_isolated_numba_cacheautouse=True 改为普通 fixture,仅由真正验证缓存行为的测试显式引用,例如:

  • test_materialize_source_is_safe_for_concurrent_same_plan_writers
  • test_build_rematerializes_source_after_cache_invalidation
  • test_specialization_cache_failure_rebuilds_callable_dispatchers_before_retry
  • test_reset_descriptor_is_part_of_numba_kernel_cache_key

其余测试共享进程内缓存,每个 distinct plan 只编译一次(文件内约 6~8 个 distinct plan),预计总耗时降至 ~8-10s,测试数量与覆盖不变。

语义上也更准确:绝大多数测试验证的是 env 行为契约,不需要冷缓存隔离。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions