codekingpro/portable-devtools
114k
1 2"""3A benchmark for validation of applicators containing lots of useless schemas.4 5Signals a small possible optimization to remove all such schemas ahead of time.6"""7 8from pyperf import Runner9 10from jsonschema import Draft202012Validator as Validator11 12NUM_USELESS = 10000013 14subschema = {"const": 37}15 16valid = 3717invalid = 1218 19baseline = Validator(subschema)20 21 22# These should be indistinguishable from just `subschema`23by_name = {24 "single subschema": {25 "anyOf": Validator({"anyOf": [subschema]}),26 "allOf": Validator({"allOf": [subschema]}),27 "oneOf": Validator({"oneOf": [subschema]}),28 },29 "redundant subschemas": {30 "anyOf": Validator({"anyOf": [subschema] * NUM_USELESS}),31 "allOf": Validator({"allOf": [subschema] * NUM_USELESS}),32 },33 "useless successful subschemas (beginning)": {34 "anyOf": Validator({"anyOf": [subschema, *[True] * NUM_USELESS]}),35 "allOf": Validator({"allOf": [subschema, *[True] * NUM_USELESS]}),36 },37 "useless successful subschemas (middle)": {38 "anyOf": Validator(39 {40 "anyOf": [41 *[True] * (NUM_USELESS // 2),42 subschema,43 *[True] * (NUM_USELESS // 2),44 ],45 },46 ),47 "allOf": Validator(48 {49 "allOf": [50 *[True] * (NUM_USELESS // 2),51 subschema,52 *[True] * (NUM_USELESS // 2),53 ],54 },55 ),56 },57 "useless successful subschemas (end)": {58 "anyOf": Validator({"anyOf": [*[True] * NUM_USELESS, subschema]}),59 "allOf": Validator({"allOf": [*[True] * NUM_USELESS, subschema]}),60 },61 "useless failing subschemas (beginning)": {62 "anyOf": Validator({"anyOf": [subschema, *[False] * NUM_USELESS]}),63 "oneOf": Validator({"oneOf": [subschema, *[False] * NUM_USELESS]}),64 },65 "useless failing subschemas (middle)": {66 "anyOf": Validator(67 {68 "anyOf": [69 *[False] * (NUM_USELESS // 2),70 subschema,71 *[False] * (NUM_USELESS // 2),72 ],73 },74 ),75 "oneOf": Validator(76 {77 "oneOf": [78 *[False] * (NUM_USELESS // 2),79 subschema,80 *[False] * (NUM_USELESS // 2),81 ],82 },83 ),84 },85 "useless failing subschemas (end)": {86 "anyOf": Validator({"anyOf": [*[False] * NUM_USELESS, subschema]}),87 "oneOf": Validator({"oneOf": [*[False] * NUM_USELESS, subschema]}),88 },89}90 91if __name__ == "__main__":92 runner = Runner()93 94 runner.bench_func("baseline valid", lambda: baseline.is_valid(valid))95 runner.bench_func("baseline invalid", lambda: baseline.is_valid(invalid))96 97 for group, applicators in by_name.items():98 for applicator, validator in applicators.items():99 runner.bench_func(100 f"{group}: {applicator} valid",101 lambda validator=validator: validator.is_valid(valid),102 )103 runner.bench_func(104 f"{group}: {applicator} invalid",105 lambda validator=validator: validator.is_valid(invalid),106 )107 