2

(免责声明:我读过的关于stackoverflow的每一次性能比较都因为不全面/正确/写得好/相关等而受到抨击。等等-我不是假装这是一个真正的比较或完美的设置,我只是想知道我是否可以使 cerberus 更快地验证数据。)

我有cerberus的以下模型设置:

v = Validator({
    'id': {'type': 'integer', 'required': True},
    'client_name': {'type': 'string', 'maxlength': 255, 'required': True},
    'sort_index': {'type': 'float', 'required': True},
    'client_phone': {'type': 'string', 'maxlength': 255, 'nullable': True},
    'location': {
        'type': 'dict',
        'schema': {'latitude': {'type': 'float'}, 'longitude': {'type': 'float'}},
        'nullable': True,
    },
    'contractor': {'type': 'integer', 'min': 0, 'nullable': True, 'coerce': int},
    'upstream_http_referrer': {'type': 'string', 'maxlength': 1023, 'nullable': True},
    'grecaptcha_response': {'type': 'string', 'minlength': 20, 'maxlength': 1000, 'required': True},
    'last_updated': {'type': 'datetime', 'nullable': True, 'coerce': datetime_parse},
    'skills': {
        'type': 'list',
        'default': [],
        'schema': {
            'type': 'dict',
            'schema': {
                'subject': {'type': 'string', 'required': True},
                'subject_id': {'type': 'integer', 'required': True},
                'category': {'type': 'string', 'required': True},
                'qual_level': {'type': 'string', 'required': True},
                'qual_level_id': {'type': 'integer', 'required': True},
                'qual_level_ranking': {'type': 'float', 'default': 0, 'required': True},
            },
        },
    },
})

...

def do_validation(data):
    validated = v.validated(data)
    if validated is None:
        return False, v.errors
    else:
        return True, validated

这用于验证数据,大约 50% 的数据通过do_validation

问题是 cerberus在执行此验证时非常慢,每次验证平均花费超过一毫秒。相比之下,这比其他库慢 10 倍以上,比pydantic我对其进行基准测试时慢 26 倍。

如果 cerberus 稍微慢一点,我不会感到惊讶,但这种差异似乎太极端了,无法理解。

我做错了什么会严重损害性能吗?


上面的代码是为pydantic 文档的基准测试部分编写的。

添加 cerberus 的 PR(当前)在此处打开,其中包含完整的代码和结果。

4

0 回答 0