Прогулка по списку без создания ненужного объекта

Я обычно делаю это:

[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. Декремент реф-счета намного дешевле, чем метка-развертка. Оцените его, а затем решите, уделяете ли вы слишком много внимания небольшой стоимости.

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

Другие вопросы по тегам