如何使用 pytest 测试 numba 向量化函数
How can i test numba vectorized functions with pytest
我目前正在编写几个函数,它们都使用 numba
进行了优化(一个使用 @guvectorize
,一个使用 @vectorize
。
我还为这两个函数编写了一些测试,但是当我 运行 pytest --cov --cov-report term-missing
我得到缺失的行对应于优化的函数。
这是 pytest 运行 函数测试的问题还是其他(我的)问题?
两个函数中最简单的是:
@vectorize(["float64(float64, float64)", "float32(float32, float32)"], nopython=True)
def binarize_mask(mask_data, threshold):
"""Binarize the mask array based on a threshold.
:param mask_data: Mask array.
:param threshold: Threshold to apply to the mask.
"""
# Binarize the mask array
return 1 if mask_data >= threshold else 0
我用以下测试进行测试:
- 对于单个值:
def test_binarize_mask_return_value():
threshold = np.float32(0.5)
assert dl.binarize_mask(np.float32(0.3), threshold) == 0
assert dl.binarize_mask(np.float32(0.7), threshold) == 1
- 对于数组:
def test_binarize_mask_float32():
test_data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float32)
test_mask = np.array([0, 0, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.float32)
binarized = dl.binarize_mask(test_data, 3.0)
assert binarized.dtype == np.float64
assert binarized.shape == test_mask.shape
assert np.all(binarized == test_mask)
只要编译了代码,coverage.py
就无法再测量代码的覆盖率。你可以找到一些 issues about 这个。
您可以通过 excluding code from coverage.py 将未经测试的代码简单地隐藏在地毯下。
但我知道你对你的代码很认真,你真的想检查你的算法。然后你可以 运行 你的测试两次。一个用于检查您的代码,另一个用于检查覆盖率,方法是设置环境变量 NUMBA_DISABLE_JIT=1
,如 here.
所述
我目前正在编写几个函数,它们都使用 numba
进行了优化(一个使用 @guvectorize
,一个使用 @vectorize
。
我还为这两个函数编写了一些测试,但是当我 运行 pytest --cov --cov-report term-missing
我得到缺失的行对应于优化的函数。
这是 pytest 运行 函数测试的问题还是其他(我的)问题?
两个函数中最简单的是:
@vectorize(["float64(float64, float64)", "float32(float32, float32)"], nopython=True)
def binarize_mask(mask_data, threshold):
"""Binarize the mask array based on a threshold.
:param mask_data: Mask array.
:param threshold: Threshold to apply to the mask.
"""
# Binarize the mask array
return 1 if mask_data >= threshold else 0
我用以下测试进行测试:
- 对于单个值:
def test_binarize_mask_return_value():
threshold = np.float32(0.5)
assert dl.binarize_mask(np.float32(0.3), threshold) == 0
assert dl.binarize_mask(np.float32(0.7), threshold) == 1
- 对于数组:
def test_binarize_mask_float32():
test_data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float32)
test_mask = np.array([0, 0, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.float32)
binarized = dl.binarize_mask(test_data, 3.0)
assert binarized.dtype == np.float64
assert binarized.shape == test_mask.shape
assert np.all(binarized == test_mask)
只要编译了代码,coverage.py
就无法再测量代码的覆盖率。你可以找到一些 issues about 这个。
您可以通过 excluding code from coverage.py 将未经测试的代码简单地隐藏在地毯下。
但我知道你对你的代码很认真,你真的想检查你的算法。然后你可以 运行 你的测试两次。一个用于检查您的代码,另一个用于检查覆盖率,方法是设置环境变量 NUMBA_DISABLE_JIT=1
,如 here.