Прогулка по списку без создания ненужного объекта
Я обычно делаю это:
[worker.do_work() for worker in workers]
Это имеет то преимущество, что он очень читабелен и содержится в одной строке, но проблема создания объекта (списка) мне не нужна, а это означает, что сборка мусора запускается излишне.
Очевидная альтернатива:
for worker in workers:
worker.do_work()
Также вполне читабелен, но использует две строки.
Есть ли однострочный способ достижения того же результата без создания ненужных объектов?
2 ответа
Конечно, есть.
def doLotsOfWork(wks):
for w in wks:
w.do_work()
А теперь ваш "один лайнер":
doLotsOfWork(workers)
Короче говоря, нет никакого "более короткого" (или лучшего способа), кроме использования for
петля. Я бы посоветовал вам не использовать понимание списка, потому что он использует побочные эффекты - это запах кода.
"GC" в Python довольно сильно отличается от Java. Декремент реф-счета намного дешевле, чем метка-развертка. Оцените его, а затем решите, уделяете ли вы слишком много внимания небольшой стоимости.
Чтобы сделать его одним слоем, просто определите вспомогательную функцию, а затем - одну строку для ее вызова. По возможности похороните функцию в импортированной библиотеке.