¿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).

Respuestas a la pregunta(1)

Su respuesta a la pregunta