У меня есть следующий код:

foo = json.loads(get_foo())

foo_file = ''
for f in foo['datas']:
    foo_file += f['bar'] + ' ' + f['barfoo'] + '\n'

with open(output, 'w') as output:
    output.write(foo_file)

Это правильный способ сделать это, или я должен прямо написать в файл, как это:

foo = json.loads(get_foo())

with open(output, 'w') as output:
    for f in foo['datas']:
        output.write(f['bar'] + ' ' + f['barfoo'] + '\n')

Менее используемая переменная используется, но файл открыт гораздо дольше. Много ли данных, не плохо ли для исполнения писать прямо в файл?

1
Shan-x 13 Янв 2017 в 14:01

4 ответа

Лучший ответ

Обычно, когда вы пишете в файл напрямую (в коде), система не сразу записывает в файл: она использует политики операционной системы (ОС), касающиеся буферизации : внутренне она сначала сохраняется в памяти и только когда объем записываемого контента превышает определенный порог, он записывается в файл.

При использовании open вы также можете указать {{X1} } .

Но вернемся к вашему вопросу: я думаю, что разница в производительности не будет такой большой, и, кроме того, не всегда возможно сначала сохранить все содержимое в переменной: скажем, вы хотите написать файл 1 TiB, есть никоим образом вы не можете хранить содержимое полностью в памяти.

В заключение отметим, что вам лучше использовать .join и форматирование строк, чтобы повысить эффективность построения строк. Это:

foo_file = ''
for f in foo['datas']:
    foo_file += f['bar'] + ' ' + f['barfoo'] + '\n'

Можно заменить на:

foo_file = ''.join('%s %s\n'%(f['bar'],f['barfoo']) for f in foo['datas'])
1
Willem Van Onsem 13 Янв 2017 в 11:07

Производительность должна быть примерно такой же, как при записи в файл.

Вы также можете сделать это так:

foo = json.loads(get_foo())

with open(output, 'w') as output:
    for f in foo['datas']:
        output.write(f['bar'] + ' ' + f['barfoo'] + '\n')
0
acidjunk 13 Янв 2017 в 11:09

Я не думаю, что это имеет большое значение, если предположить, что ваша функция f () относительно быстрая. Либо в порядке. Это может зависеть от того, для чего он вам нужен: если вам нужно получить данные позже, тогда вариант 1 лучше, в противном случае вариант 2 немного лучше.

0
buckettt 13 Янв 2017 в 11:07

Используя writelines здесь, python может сам выбрать оптимальный путь.

foo = json.loads(get_foo())

with open(output, 'w') as output:
    output.writelines(
        '{} {}\n'.format(f['bar'],f['barfoo'])
        for f in foo['datas']
    )
1
Daniel 13 Янв 2017 в 11:38