Преобразовать массив JSON String в массив объектов в Python - PullRequest
0 голосов
/ 11 июня 2018

У меня есть массив строки JSON, мне нужно преобразовать его как массив объектов (т.е. преобразовать JSON в соответствующий объект) без цикла for.

Исходный код: (входные данные)

data = ['[1,2,3]', '[4,5,6]', '[7,8,9]']

Обязательный вывод:

[[1,2,3], [4,5,6], [7,8,9]]

Я уже использую следующее решение

import json

data = ['[1,2,3]', '[4,5,6]', '[7,8,9]']
output = []
for item in data:
    output.append(json.loads(item))

В настоящее время у меня очень большое количество строк JSON (около 100K записей)и, кроме того, каждый массив строк JSON содержит запись приблизительно 50 КБ.Во время выполнения требуется более 3 ГБ ОЗУ для обработки.

Примечание : неявно выводится 2-мерный массив [][].1-е измерение - около 100 тыс. Записей. 2-е измерение - около 50 тыс. Записей.Всего 100K * 50K элементов.

Во время преобразования требуется больше времени для преобразования JSON (для описанного выше подхода).Пожалуйста, помогите мне с идеей преобразовать строку JSON без цикла for.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

ujson может сделать ваш код быстрее

import time
import json
import ujson

a_list = list(range(5000))
data = [str(a_list)] * 10000

s = time.time()

output = []
for item in data:
    output.append(json.loads(item))

print("json : %s" % (time.time()-s))

s = time.time()

output = []
for item in data:
    output.append(ujson.loads(item))

print("ujson : %s" % (time.time()-s))

На моем ПК ...

json : 10.048374891281128
ujson : 6.533677577972412
0 голосов
/ 11 июня 2018

Теперь решение выглядит проводным, но это работает и будет вам полезно при оптимизации.Конвертируйте полный список в str, затем удалите все ' одиночные запятые с помощью функции str и примените загрузку json, у меня это получилось.

data = ['[1,2,3]', '[4,5,6]', '[7,8,9]']
r = str(data).replace("'",'')

import json
data = json.loads(r)

теперь ваш data будет из списка списка без зацикливания.Вы можете достичь этого.

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
...