Понимание списка против карты

Это более длинная версия ответа Дарина:

public class CustomAttribute : ValidationAttribute
{    
    public override bool IsValid(object value)
    {
        if (value.GetType() == typeof(Foo))
        {
           Foo bar = (Foo)value;
           //compare the properties and return the result
        }

        throw new InvalidOperationException("This attribute is only valid for Foo objects");
    }
}

и использование:

[MetadataType(typeof(FooMD))]
public partial class Foo
{
     ... functions ...
}

[Custom]
public class FooMD
{
     ... other data annotations ...
}

Ошибка будет отображаться в @Html.ValidationSummary(false)

643
задан codeforester 18 November 2018 в 18:56
поделиться

3 ответа

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

Пример крошечного преимущества карты в скорости при использовании точно такой же функции:

$ python -mtimeit -s'xs=range(10)' 'map(hex, xs)'
100000 loops, best of 3: 4.86 usec per loop
$ python -mtimeit -s'xs=range(10)' '[hex(x) for x in xs]'
100000 loops, best of 3: 5.58 usec per loop

Пример того, как сравнение производительности полностью переворачивается, когда map требуется лямбда:

$ python -mtimeit -s'xs=range(10)' 'map(lambda x: x+2, xs)'
100000 loops, best of 3: 4.24 usec per loop
$ python -mtimeit -s'xs=range(10)' '[x+2 for x in xs]'
100000 loops, best of 3: 2.32 usec per loop
623
ответ дан 22 November 2019 в 21:42
поделиться

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

Там также есть интервью (я не могу найти его сразу), где Гвидо перечисляет лямбда и функциональные функции как то, о чем он больше всего сожалеет о принятии в Python, так что вы можете утверждать, что они не являются питоническими в силу этого.

16
ответ дан 22 November 2019 в 21:42
поделиться

Вот один из возможных случаев:

map(lambda op1,op2: op1*op2, list1, list2)

по сравнению с:

[op1*op2 for op1,op2 in zip(list1,list2)]

Я предполагаю, что zip () - это досадные и ненужные накладные расходы, которые вам нужно потакать, если вы настаиваете на использовании понимания списков вместо этого карты. Было бы здорово, если бы кто-нибудь прояснил это утвердительно или отрицательно.

15
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: