Насколько эффективен (в) эффективный список, если вы его не назначили?

В этом вопросе у меня есть аргумент с комментатором, который утверждает, что

for t in threads: t.join() 

будет лучше, чем

 [t.join() for t in threads] 

Оставляя в стороне вопрос о «злоупотреблении пониманием» – я склонен согласиться, но я хотел бы сделать однострочный для этого: насколько эффективна моя версия (вторая)? Является ли Python материализуемым списком понятий всегда / в моем случае или он использует встроенный генератор?

Может ли map(lambda t: t.join(), threads) быть более эффективной? Или есть другой способ применить функцию к каждому элементу в threads списка?

  • использование обратной косой черты в python (не для выхода)
  • Выполнять несколько файлов .py одновременно.
  • Цифровая сумма, Python
  • Инициализация массива NumPy (заполнение с идентичными значениями)
  • Кэширование Matplotlib с Memcache (Wont Pickle)
  • Можем ли мы назвать метод python из java?
  • математический синтаксис, написанный на python
  • При каких обстоятельствах __rmul__ называется?
  • 3 Solutions collect form web for “Насколько эффективен (в) эффективный список, если вы его не назначили?”

    Понимание списка всегда будет создавать объект списка, в этом случае с возвращаемыми значениями всех t.join() . Таким образом, Python производит как список с None значениями длины len(threads) для вас. Python никогда не попытается оптимизировать создание объекта списка.

    Использование map() также не является более эффективным, поскольку вы добавляете дополнительные стеки с помощью lambda . Просто придерживайтесь явного цикла.

    Действительно, для серии соединений нитей нет смысла пытаться микро-оптимизировать здесь. У вас болит читаемость для некритического кода.

    Другими словами, я полностью согласен с комментатором. Не используйте понимание списка или map() только для побочных эффектов и сохраняйте себя, чтобы нажать ENTER и создать две строки кода.

    Цитирование Zen Python :

    • Показатели удобочитаемости.

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

     def exhaust(iterator): for _ in iterator: pass exhaust(t.join() for t in threads) 

    Затем вы не оплачиваете стоимость всего хранилища списка.

    Не стесняйтесь переименовывать exhaust более зрелую или соответствующую вашему использованию.

    Я довольно часто видел это злоупотребление списком, даже в интервью, где мы явно давали указания кандидатам избегать неограниченного роста памяти при решении проблемы.

    Если вам нужен for t in threads: t.join() почему бы просто не использовать for t in threads: t.join() ?

    Похоже, это самое простое решение для меня и, скорее всего, будет самым быстрым (хотя на самом деле накладные расходы на объединение потоков, скорее всего, будут затмевать что-нибудь еще IMO)

    Interesting Posts
    Python - лучший язык программирования в мире.