Рубрики
Без рубрики

Карта против списка понимания в Python

MAP VS Список понимания. Какой использовать? Теги с Python, Cpython, карта.

Итак, я пытался выучить ELM (я только что сдался), тогда я увидел этот запрос функции:

Я предлагаю добавлять представления списка в ELM. Они видят тяжелое использование на языках, которые их реализуют. Учитывая существующие сходства между ELM и HASKELL Syntax, я предлагаю с использованием ческами в стиле Haskell, как это:

[(x, y) | x <- [1..10], y <- [1..20], x /= y]

карта спектакль:

lambdef lab λ python -m timeit "map(lambda a: a*a, range(100))"
100000 loops, best of 3: 11.5 usec per loop

Понимание списка спектакль:

lambdef lab λ python -m timeit "[a*a for a in range(100)]"     
100000 loops, best of 3: 5.51 usec per loop

Понимание списка 2 раза быстрее!

На самом деле, Понимание списка Выглядит более лаконично и красиво, чем карта. Например:

[n for n in nlist]|
                  |
                  |
map(lambda n: n, nlist)

Это на 5 байтов больше и медленнее! Плохой!

Есть дес Чтобы показать Python Bytecode Code Python. Давайте посмотрим на байткоде Понимание списка и карта сравнить производительность.

Bytecode of [n for n in range(100)] (List comprehension)

  1           0 LOAD_CONST               0 ( at 0x7f042c8eac00, file "", line 1>)
              2 LOAD_CONST               1 ('')
              4 MAKE_FUNCTION            0
              6 LOAD_NAME                0 (range)
              8 LOAD_CONST               2 (100)
             10 CALL_FUNCTION            1
             12 GET_ITER
             14 CALL_FUNCTION            1
             16 RETURN_VALUE

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

Bytecode of map(lambda n: n, range(100)) (Map)

  1           0 LOAD_NAME                0 (map)
              2 LOAD_CONST               0 ( at 0x7f042c8ead20, file "", line 1>)
              4 LOAD_CONST               1 ('')
              6 MAKE_FUNCTION            0
              8 LOAD_NAME                1 (range)
             10 LOAD_CONST               2 (100)
             12 CALL_FUNCTION            1
             14 CALL_FUNCTION            2
             16 RETURN_VALUE

Он загружает функцию карты, она загружает лямбда ( lambda n: n ), делает объект функции лямбда, нагрузок функцию диапазона и нагрузки 100, чтобы дать ему аргумент, вызывает две функции и возвращает значение.

На мой взгляд, Bytecode Python понятен людьми ™.

Список понимания

  • Плюс
    • Поддержка для генерации списков напрямую
    • Поддержка для генерации генераторов напрямую
    • Фильтрация (IFS)
    • Краткий
    • Быстро
  • Господин
    • Нет минусов! (ИМО)

карта

  • Плюс
    • Нет профессионалов! (ИМО)
  • Господин
    • Генерирует Только объект карты (вам нужно включить его в объект, который вы хотите позже)
    • Нет IFS (фильтрация)
    • Помедленнее
    • Подробный
  • Удвоить каждый номер до 100
# List comprehension
[n*2 for n in range(100)]

# Map
map(lambda n: n*2, range(100))
  • Применить fn каждому номеру до 100
# List comprehension
[fn(n) for n in range(100)]

# Map
map(fn, range(100))
  • Фильтр. Эванс
# List comprehension
[n for n in range(100) if n % 2 == 0]

# Map
not_possible()
# But you can use filter:
# filter(lambda n: n % 2 == 0)

Использовать Понимание списка над карта Оптимизация вашего кода.

Спасибо за чтение!

Оригинал: “https://dev.to/lyfolos/map-vs-list-comprehension-in-python-2ljj”