Итак, я пытался выучить 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”