| import json
|
| import timeit
|
| import os
|
|
|
| import simdjson
|
| import orjson
|
| import ujson
|
|
|
| # Cargar el archivo una sola vez
|
| FILE = r'C:\Users\USER\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Shared Projects\JsonParserByLeo\Test\Ben\twitter.json'
|
| assert os.path.exists(FILE), f"No se encontró {FILE}"
|
|
|
| with open(FILE, "rb") as f:
|
| raw_bytes = f.read()
|
|
|
| raw_str = raw_bytes.decode("utf-8")
|
|
|
| print(f"Archivo : {FILE}")
|
| print(f"Tamaño : {len(raw_bytes) / 1024:.1f} KB")
|
| print(f"Iters : 1000\n")
|
| print(f"{'Librería':<22} {'Total (s)':>10} {'Por iter (ms)':>14} {'Speedup vs json':>16}")
|
| print("─" * 68)
|
|
|
| ITERS = 1000
|
|
|
| # stdlib json
|
| t_json = timeit.timeit(lambda: json.loads(raw_str), number=ITERS)
|
|
|
| # orjson
|
| t_orjson = timeit.timeit(lambda: orjson.loads(raw_bytes), number=ITERS)
|
|
|
| # ujson
|
| t_ujson = timeit.timeit(lambda: ujson.loads(raw_str), number=ITERS)
|
|
|
| # simdjson.loads (drop-in)
|
| t_simdjson_loads = timeit.timeit(lambda: simdjson.loads(raw_str), number=ITERS)
|
|
|
| # simdjson Parser reutilizado
|
| parser = simdjson.Parser()
|
| t_simdjson_parser = timeit.timeit(lambda: parser.parse(raw_bytes), number=ITERS)
|
|
|
| # simdjson Parser + as_dict (convierte todo)
|
| t_simdjson_dict = timeit.timeit(
|
| lambda: parser.parse(raw_bytes).as_dict(), number=ITERS
|
| )
|
|
|
| # Imprimir resultados
|
| results = [
|
| ("json (stdlib)", t_json),
|
| ("ujson", t_ujson),
|
| ("orjson", t_orjson),
|
| ("simdjson.loads", t_simdjson_loads),
|
| ("simdjson.Parser", t_simdjson_parser),
|
| ("simdjson.Parser+as_dict",t_simdjson_dict),
|
| ]
|
|
|
| baseline = t_json
|
| for name, t in results:
|
| per_iter = (t / ITERS) * 1000
|
| speedup = baseline / t
|
| print(f"{name:<22} {t:>10.3f}s {per_iter:>13.2f}ms {speedup:>14.2f}x")
|