为什么单个模块导入会给pytest运行增加1.5秒?

2024-09-27 00:19:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用TDD编写一些代码,并且有一个类似这样的测试(注意,我使用的是pytest-describe,但是在使用没有附加格式的测试时也存在同样的问题):

import numpy as np
import pytest
from maszcal.emulator import LensingEmulator, LargeErrorWarning




class FakeInterpolator:
    def __init__(self, coords, grid):
        pass

    def process(self):
        pass

    def interp(self, coords):
        return np.ones(tuple(c.size for c in coords))


def describe_emulator():

    def describe_error_check():

        @pytest.fixture
        def emulator(mocker):
            mocker.patch('maszcal.emulator.RbfInterpolator', new=FakeInterpolator)
            lensing_emulator = LensingEmulator()
            lensing_emulator.generate_grid = lambda coords: np.ones(tuple(c.size for c in coords))
            return lensing_emulator

        def other_test_1(emulator):
            do_stuff_with_emulator...

即使有pytest --collectonly,这个测试也需要2.5-3秒来运行。当LensingEmulator被导入时,它从maszcal.interpolate模块导入,如下所示:

spec/emulator/LensingEmulator.py
    imports ↑  
maszcal/emulator.py
    imports ↑
maszcal/interpolate.py
    imports ↑
          GPy

其中GPy是一个外部模块。当然还有其他依赖关系,但奇怪的是,如果我从maszcal.interpolate中删除import GPy行,我会得到0.9秒的加速,而不是2.5-3秒

我对这种行为感到相当困惑,因为单独导入模块并没有那么慢,但是它在测试的收集阶段增加了一个荒谬的时间量。解决这个问题的正确方法是什么


Tags: 模块pyimportselfpytestdefnpcoords

热门问题