¿Por qué json.loads es un orden de magnitud más rápido que ast.literal_eval?
Después de responder una pregunta sobrecómo analizar un archivo de texto que contiene matrices de flotadores, Me encontré con el siguiente punto de referencia:
import timeit
import random
line = [random.random() for x in range(1000)]
n = 10000
json_setup = 'line = "{}"; import json'.format(line)
json_work = 'json.loads(line)'
json_time = timeit.timeit(json_work, json_setup, number=n)
print "json: ", json_time
ast_setup = 'line = "{}"; import ast'.format(line)
ast_work = 'ast.literal_eval(line)'
ast_time = timeit.timeit(ast_work, ast_setup, number=n)
print "ast: ", ast_time
print "time ratio ast/json: ", ast_time / json_time
Ejecuté este código varias veces y obtuve consistentemente este tipo de resultados:
$ python json-ast-bench.py
json: 4.3199338913
ast: 28.4827561378
time ratio ast/json: 6.59333148483
Así que parece quejson
es casi un orden de magnitud más rápido queast
para este caso de uso.
Obtuve los mismos resultados con Python 2.7.5+ y Python 3.3.2+.
Preguntas:
¿Por qué json.loads es mucho más rápido?Esta pregunta Parece implicar que ast es más flexible con respecto a los datos de entrada (comillas dobles o simples)¿Hay casos de uso donde prefiero usar?ast.literal_eval
terminadojson.loads
aunque es mas lento?Editar: De todos modos si el rendimiento importa, recomendaría usarUltraJSON (justo lo que uso en el trabajo, ~ 4 veces más rápido que json usando el mismo mini-punto de referencia).