(Отказ от ответственности: Каждое сравнение производительности в потоке стека, которое я читаю, подвергается критике за то, что оно не является исчерпывающим / правильным / хорошо написанным / соответствующим и т. Д. И т. Д. просто хотелось бы узнать, могу ли я заставить Цербер быстрее проверять данные.)
У меня есть следующая модель настройки с Цербер :
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
.
Проблема заключается в том, что цербер очень медленно при выполнении этой проверки, что занимает в среднем более миллисекунды для каждойПроверка. Для сравнения, это в 10 раз медленнее, чем в других библиотеках, и в 26 раз медленнее, чем pydantic
, с которым я сравнивал.
Я не удивлюсь, если Цербер будет немного медленнее, ноэта разница кажется слишком сильной, чтобы иметь смысл.
Я делаю что-то не так, что значительно ухудшает производительность?
Приведенный выше код был написан для раздела тестов из документов Пидантика.
PR, добавляющий Цербер, (в настоящее время) открыт здесь с полным кодом и результатами.