Все эти библиотеки и реализации выполняют какое-то сопоставление с шаблоном, чтобы найти части файла, которые вы хотите проверить. Затем на выбранные элементы необходимо воздействовать, как правило, путем продвижения контента в Python структуру данных.
По умолчанию i json копирует вложенный документ в Python dict / list после первоначального соответствие шаблону произошло. Это влечет за собой стоимость. Если вы хотите манипулировать частью документа в Python (а не извлекать скаляр / строку), вам все равно нужно выполнить конвертацию. С реализацией C, выполняющей синтаксический анализ, это требует превращения переменной C в Python.
При работе с глубокой структурой данных, которую вы должны загружать много, вы можете обнаружить, что Преимущества синтаксического анализа файла в C сводятся на нет из-за стоимости конвертации в Python, после чего чистая реализация Python обходит некоторые из затрат на конвертацию.
jsonslicer невероятно быстр для простого извлечения задач, но это также будет сталкиваться с аналогичными ограничениями по мере роста сложности извлечения. У меня есть несжатый файл JSON размером 970 МБ, состоящий из списка документов. В моем случае выбор тривиальной строки из свойства 3-го уровня выглядит следующим образом:
with gzip.open('big_docs.json.gz') as file:
for thing in JsonSlicer(file, (None, 'key')):
# print(thing)
if thing == 'special_value':
pass
with gzip.open('big_docs.json.gz') as file:
for thing in ijson.items(file, 'item'):
if thing['key'] == 'special_value':
pass
- i json (используется связывание по умолчанию C) - 363s
- я json (чистый Python) - 686 с
- jsonslicer - 15 с
В этом несправедливом сравнении jsonslicer может избежать преобразования чего угодно, кроме строки, в Python практически нулевая стоимость, поэтому результат поразительно быстр. Мое наивное использование i json должно выполнять гораздо больше работы.
В этом случае, если я копаю два слоя глубже, не меняя взаимодействие, я получаю:
- i json - 350 с
- i json (чистый python) - 667 с
- jsonslicer - 16 с
jsonslicer немного замедляется с проверкой большего количества, тогда как i json делает то же самое, но выигрывает за счет моделирования небольших разделов документа. Более сложные виды использования меняют баланс. Доказать, что приведение от C к Python - это то, почему ваш невидимый код медленнее, было бы сложно, но это может способствовать!