75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
#!/usr/env/bin python
|
|
"""
|
|
Benchmark the performance of jsonschema.
|
|
|
|
Example benchmark:
|
|
|
|
wget http://swagger.io/v2/schema.json
|
|
wget http://petstore.swagger.io/v2/swagger.json
|
|
python bench.py -r 5 schema.json swagger.json
|
|
|
|
"""
|
|
from __future__ import print_function
|
|
import argparse
|
|
import cProfile
|
|
import json
|
|
import time
|
|
|
|
import jsonschema
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('schema', help="path to a schema used to benchmark")
|
|
parser.add_argument('document', help="document to validate with schema")
|
|
parser.add_argument('-r', '--repeat', type=int, help="number of iterations")
|
|
parser.add_argument('--profile',
|
|
help="Enable profiling, write profile to this filepath")
|
|
return parser.parse_args()
|
|
|
|
|
|
def run(filename, schema, document):
|
|
resolver = jsonschema.RefResolver(
|
|
'file://{0}'.format(filename),
|
|
schema,
|
|
store={schema['id']: schema})
|
|
jsonschema.validate(document, schema, resolver=resolver)
|
|
|
|
|
|
def format_time(time_):
|
|
return "%.3fms" % (time_ * 1000)
|
|
|
|
|
|
def run_timeit(schema_filename, document_filename, repeat, profile):
|
|
with open(schema_filename) as schema_file:
|
|
schema = json.load(schema_file)
|
|
|
|
with open(document_filename) as fh:
|
|
document = json.load(fh)
|
|
|
|
if profile:
|
|
profiler = cProfile.Profile()
|
|
profiler.enable()
|
|
|
|
times = []
|
|
for _ in range(repeat):
|
|
start_time = time.time()
|
|
run(schema_filename, schema, document)
|
|
times.append(time.time() - start_time)
|
|
|
|
if profile:
|
|
profiler.disable()
|
|
profiler.dump_stats(profile)
|
|
|
|
print(", ".join(map(format_time, sorted(times))))
|
|
print("Mean: {0}".format(format_time(sum(times) / repeat)))
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
run_timeit(args.schema, args.document, args.repeat, args.profile)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|