(免責事項:私が読んだ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 が非常に遅く、各検証に平均で 1 ミリ秒以上かかることです。比較すると、これは他のライブラリよりも 10 倍以上遅く、pydantic
私がベンチマークしたライブラリよりも 26 倍遅いです。
cerberus がもう少し遅かったとしても驚かないでしょうが、この差は極端すぎて意味がないように思えます。
パフォーマンスを大幅に損なう何か間違ったことをしていますか?
上記のコードは、pydantic のドキュメントのベンチマーク セクション用に作成されました。
cerberus を追加する PR は、(現在)ここで完全なコードと結果とともに公開されています。