Я думал, что было бы интересно изучить преимущества использования гена xp, так что вот мое занятие.
Пример в вопросе использует квадратные скобки, чтобы создать временный список, так что эквивалентно:
file.writelines(list("%s\n" % item for item in list))
Какие понапрасну строит временный список всех строк, которые будут выписаны, это может потреблять значительные объемы памяти в зависимости от размера вашего списка и того, насколько подробным является вывод str(item)
.
Капля квадратные скобки (что эквивалентно удалению оберточной list()
вызова выше) вместо этого будет проходить временный generator к file.writelines()
:
file.writelines("%s\n" % item for item in list)
Этот генератор создаст новой строки с завершающим представление ваших item
объектов по требованию (т.е. поскольку они выписаны).Это хорошо для нескольких причин:
- накладные расходы памяти невелики, даже для очень больших списков
- Если
str(item)
медленно есть заметный прогресс в файле, поскольку каждый элемент обрабатывается
Это позволяет избежать проблем с памятью, такие как:
In [1]: import os
In [2]: f = file(os.devnull, "w")
In [3]: %timeit f.writelines("%s\n" % item for item in xrange(2**20))
1 loops, best of 3: 385 ms per loop
In [4]: %timeit f.writelines(["%s\n" % item for item in xrange(2**20)])
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
...
MemoryError
(я вызвал этот ошибка, ограничивая макс. Python. виртуальная память до ~ 100 МБ с ulimit -v 102400
).
Положив использование памяти с одной стороны, этот метод не является на самом деле быстрее, чем оригинал:
In [4]: %timeit f.writelines("%s\n" % item for item in xrange(2**20))
1 loops, best of 3: 370 ms per loop
In [5]: %timeit f.writelines(["%s\n" % item for item in xrange(2**20)])
1 loops, best of 3: 360 ms per loop
(Python 2.6.2 на Linux)
не отметить, что 'writelines' не добавляет новые строки, потому что он отображает 'readlines', что также не удаляет их. – SingleNegationElimination