У меня есть код, содержащий много итераций цикла, с операторами open file и close file, расположенными следующим образом:

  • Основной цикл

    1. работаю

    2. открытые файлы

    3. записать в файлы

    4. закрыть файлы

    5. продолжить работу

  • конец цикла

Но альтернатива:

  • открытые файлы

  • Основной цикл

    1. работаю

    2. записать в файлы, [сбросить]

    3. продолжить работу

  • конец цикла

  • закрыть файлы

Есть ли «лучший способ» позиционирования операторов open file и close file, содержащих множество итераций цикла? Есть ли у каждого преимущества / недостатки? Увижу ли я разницу в производительности? Ограничения памяти? Проблемы будущего развития?

В основном я кодирую на Фортране (отсюда и тег), однако я хотел бы знать, зависит ли это от языка или нет, поскольку я также программирую на других языках. Любая помощь приветствуется.

1
Charles 7 Сен 2016 в 21:33

2 ответа

Лучший ответ

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

Обратите внимание на следующее:

def foo():
    f = open('bar.txt', 'w')
    for i in range(1000):
        f.write('a')
    f.close()

def bar():
    for i in range(1000):
        f = open('bar.txt', 'w')
        f.write('a')
        f.close()

Давайте время:

>>> %timeit foo()
10000 loops, best of 3: 190 µs per loop

>>> %timeit bar()
10 loops, best of 3: 47.8 ms per loop

Так что открывать и закрывать очень дорого.

Каковы преимущества (или, по крайней мере, смягчающие факторы) постоянных открытий и закрытий?

  1. Менее открытые файловые дескрипторы.

  2. Когда вы закрываете файл, данные сбрасываются в него. Конечно, вы можете просто вызвать flush, но это дорогостоящая операция сама по себе, и разница во времени станет меньше.

Если у вас нет важных данных (то есть вы можете просто перезапустить программу, если она выйдет из строя), и у вас не слишком много проблем с открытыми файловыми дескрипторами - несколько открытий и закрытий, вероятно, будут быстрее.

2
Ami Tavory 7 Сен 2016 в 19:24

Выполнение задачи много раз (в цикле) по сравнению с выполнением ее только один раз (вне цикла), очевидно, будет более затратным - независимо от используемого языка.

0
Jesper Juhl 7 Сен 2016 в 19:59