Где использовать функцию карты core-python? - PullRequest
0 голосов
/ 19 мая 2019

Лучший способ построить эффективно - это понять инструментарий, с которым он собирается. Однако, пытаясь понять основные функции python, мне пришло в голову, что функция map дает схожие, если не те же результаты, что и обобщенное выражение генератора.

Возьмем следующий бит кода в качестве упрощенного примера. Эти два объекта, нанесенные на карту и созданные, ведут себя поразительно схожими в любой ситуации, когда вы их бросаете.

def concatenate(string1 = "", string2 = ""):
    return string1.join(" ", string2)

foo = ["One", "Two"]
bar = ["Blue", "Green"]

mapped = map(concatenate, foo, bar)
generated = (concatenate(string1 = a, string2 = b) for a, b in zip(foo, bar))

Хорошо, я знаю, что это более длинная строка кода, но мне трудно поверить, что это причина существования карты, поэтому в моем стремлении понять Python. Что еще делает карта в python? Действительно ли это просто пережиток старины, и если нет, то где мне лучше всего использовать этот инструмент?

1 Ответ

0 голосов
/ 19 мая 2019

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

Это может рассматриваться как техническая составляющая, хотя, поскольку часто, когда вы используете понимание списка, чтобы сделать что-то, что может сделать карта, вы перезаписываете исходную переменную:

a = [1, 2, 3]
# The following line creates a new list but
# since we assign that list to `a` we give the old list to 
# the garbage collector
a = [x**2 for x in a]
# or
a = list(map(lambda x: x**2, a))
# both of which are basically the same.

Сила карты может проявитьсяИграйте, если вы не работаете с той же переменной:

a = [1, 2, 3] # If we want to save this then we don't want to overwrite it
b = [x**2 for x in a] # A full new list is now in b
c = map(lambda x: x**2, a) # c is just a generator object.
print(a) # [1, 2, 3]
print(b) # [1, 4, 9]
print(c) # <map object ...>
for x in c:
    print(x) 
    # We never create a full list from c, we just use each object as we go thus we save memory.

В предыдущем примере b - это совершенно новая list память, где c - просто объект генератора.При работе с такими маленькими a, b и c, вероятно, довольно близки в памяти, но если бы a было большим, c было бы значительно меньше памяти, чем b.

Большинствослучаи общего использования map связаны с первым случаем, поэтому map не имеет реальной выгоды, но во втором случае гораздо выгоднее использовать map.

для записи "один способ сделатьчто-то "из дзен" является своего рода расплывчатым.Я мог бы реализовать сортировку слиянием правильным способом (т.е. с идеальной скоростью и пространством), но мой код выглядел совершенно иначе, чем кто-то другой, кто реализовал сортировку слиянием.«Один способ» на самом деле не означает только один способ его кодирования, это скорее означает, что нужно использовать только одну методологию или один процесс.

...