Цербер очень медлителен, что я сделал не так? - PullRequest
0 голосов
/ 09 ноября 2019

(Отказ от ответственности: Каждое сравнение производительности в потоке стека, которое я читаю, подвергается критике за то, что оно не является исчерпывающим / правильным / хорошо написанным / соответствующим и т. Д. И т. Д. просто хотелось бы узнать, могу ли я заставить Цербер быстрее проверять данные.)

У меня есть следующая модель настройки с Цербер :

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, добавляющий Цербер, (в настоящее время) открыт здесь с полным кодом и результатами.

...