You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效实现Hypothesis策略生成元素满足指定比例唯一性?

实现Hypothesis策略的部分唯一元素(高效版)

原代码中使用unique=True强制所有元素唯一,在数组规模较大或元素取值空间有限时,会因Hypothesis不断重试生成符合条件的数组导致效率极低。如果仅需保证一定比例的元素唯一,最高效的实现方式是混合生成唯一元素与重复元素,而非基于全唯一策略修改。

核心思路

将数组拆分为两部分:

  • 小部分强制生成唯一元素(占比可配置)
  • 剩余部分从已生成的唯一元素中随机采样重复(或混合新随机元素,前者更易控制唯一比例)

这种方式既满足了“一定比例唯一”的需求,又彻底规避了全唯一约束带来的性能损耗。

代码实现

import numpy as np
import hypothesis.strategies as st
import hypothesis.extra.numpy as st_np

# 假设ARR_LEN是预设的数组长度边界,比如(1, 100)
ARR_LEN = (1, 100)

def base_float(
    min_value=None,
    max_value=None,
    *,
    allow_nan=False,
    allow_infinity=False,
    allow_subnormal=False,
):
    """Strategy for returning a float."""
    return st.floats(
        min_value=min_value,
        max_value=max_value,
        allow_nan=allow_nan,
        allow_infinity=allow_infinity,
        allow_subnormal=allow_subnormal,
    )

@st.composite
def plaus_arr(draw, size=None, bounds=ARR_LEN, unique_ratio=0.5):
    # 确定最终数组大小
    size = draw(st.integers(*bounds)) if size is None else size
    # 计算需要唯一的元素数量,至少保留1个唯一元素
    unique_count = max(1, int(size * unique_ratio))
    
    # 生成唯一元素段
    unique_elements = draw(st_np.arrays(float, unique_count, elements=base_float(), unique=True))
    
    # 生成重复元素段(从唯一元素中采样)
    remaining_count = size - unique_count
    if remaining_count > 0:
        repeated_elements = draw(st_np.arrays(float, remaining_count, elements=st.sampled_from(unique_elements)))
        # 合并后打乱顺序,避免唯一元素集中在开头
        combined = draw(st.permutations(np.concatenate([unique_elements, repeated_elements])))
        return np.array(combined)
    return unique_elements

方案优势

  1. 性能大幅提升:仅对小部分元素要求唯一,Hypothesis无需频繁重试;重复元素直接采样,无额外生成成本。
  2. 比例灵活可控:通过unique_ratio参数可调整唯一元素的占比(范围0~1,设为1时退化为原全唯一逻辑)。
  3. 测试覆盖均匀:打乱合并后的数组,避免唯一元素集中分布,保证测试场景的随机性。

对原问题的补充说明

不需要修改全唯一场景的实现方案,因为这类方案本质还是围绕“全唯一”优化,无法直接适配“部分唯一”的需求。上述混合生成的方式才是针对该需求的最优解。

内容的提问来源于stack exchange,提问作者curlew77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:15:49