(免责声明:我读过的关于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(当前)在此处打开,其中包含完整的代码和结果。