У меня есть код, который в значительной степени опирается на yaml для многоязыковой сериализации, и, работая над ускорением некоторых вещей, я заметил, что yaml был безумно медленным по сравнению с другими методами сериализации (например, pickle, json).
Итак, что действительно вызывает у меня в голове то, что json намного быстрее, чем yaml, когда результат почти идентичен.
>>> import yaml, cjson; d={'foo': {'bar': 1}}
>>> yaml.dump(d, Dumper=yaml.SafeDumper)
'foo: {bar: 1}\n'
>>> cjson.encode(d)
'{"foo": {"bar": 1}}'
>>> import yaml, cjson;
>>> timeit("yaml.dump(d, Dumper=yaml.SafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
44.506911039352417
>>> timeit("yaml.dump(d, Dumper=yaml.CSafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
16.852826118469238
>>> timeit("cjson.encode(d)", setup="import cjson; d={'foo': {'bar': 1}}", number=10000)
0.073784112930297852
PyYaml CSafeDumper и cjson написаны на C, так что это не так, как проблема скорости C vs Python. Я даже добавил к нему некоторые случайные данные, чтобы узнать, делает ли cjson какое-либо кэширование, но все еще быстрее, чем PyYaml. Я понимаю, что yaml является надмножеством json, но как может быть, что последовательный сериал yaml на 2 порядка медленнее с таким простым вводом?