Быстрее сделать массовую запись или запись в файл меньшими частями? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть скрипт на python, который читает плоский файл и записывает записи в файл JSON. Будет ли быстрее сделать запись сразу:

dict_array = []
for record in records:
    dict_array.append(record)
# writes one big array to file
out_file.write(json.dumps(dict_array))

Или записать в файл, поскольку итератор выдает каждую запись?

for record in records:
    out_file.write(json.dumps(record) + '\n')

Количество записей в records составляет около 81,000.

Кроме того, формат JSON может быть одним большим массивом объектов (случай 1) или объектами, разделенными строками (случай 2).

Ответы [ 2 ]

0 голосов
/ 05 июля 2018
import json

dict_array = []
records = range(10**5)

start = time.time()
for record in records:
    dict_array.append(record)
out_file.write(json.dumps(dict_array))
end = time.time()
print(end-start)
#0.07105851173400879

start = time.time()
for record in records:
    out_file.write(json.dumps(record) + '\n')
end = time.time()
print(end-start)
#1.1138122081756592

start = time.time()
out_file.write(json.dumps([record for record in records]))
end = time.time()
print(end-start)
#0.051038265228271484

Я не знаю, что такое records, но на основе этих тестов понимание списка происходит быстрее всего, за ним следует создание списка и его одновременная запись, а затем запись по одной записи за раз. В зависимости от того, что records, просто выполнение out_file.write(json.dumps(records))) может быть даже быстрее.

0 голосов
/ 05 июля 2018

Ваши два решения не делают одно и то же. Первый пишет допустимый объект JSON. Второй пишет, вероятно, правильный (но вы должны быть осторожным) файл JSONlines (и, возможно, также NDJSON / LDJSON и NDJ). Таким образом, способ обработки данных позже будет совсем другим. И это самое главное: хотите ли вы файл JSON или файл JSONlines?

Но так как вы спросили о производительности: это зависит.

Файлы Python по умолчанию буферизуются, поэтому выполнение целой связки небольших записей выполняется лишь чуть-чуть медленнее, чем выполнение одной большой записи. Но это крошечный бит медленнее, а не ноль .

С другой стороны, создание огромного списка в памяти означает выделение и копии, которые в противном случае не нужны. Это почти наверняка будет более значимым, если только ваши значения не очень малы, а ваш список не очень короткий.

Не видя ваших данных, я бы дал 10: 1 шансов, что итеративное решение получится быстрее, но зачем полагаться на это едва образованное предположение? Если это имеет значение, сравните с вашими фактическими данными timeit.

С третьей стороны, 81 000 типичных записей JSON - это, по сути, ничто, поэтому, если вы не делаете это миллионы раз, возможно, даже не стоит измерять. Если вы потратите час на то, чтобы понять, как его измерить, выполнить тесты и интерпретировать результаты (не говоря уже о времени, которое вы потратили на SO), сэкономить 23 миллисекунды в день в течение недели, а затем больше ничего… ну, чтобы программист, это всегда привлекательно, но все же это не всегда хорошая идея.

...