2012-01-30 4 views
2

У меня есть список объектов, и я хочу изменить значение атрибута всех объектов (с тем же значением - NewValue).map, когда возвращаемое значение не требуется

Является ли map() более эффективным, чем обычный цикл, в этой ситуации, когда функция (лямбда) не возвращает никакого значения?

map (lambda x: x.attribute = NewValue, li) 

против

for i in li: 
    i.attribute = NewValue 
+0

[Этот ответ] (http://stackoverflow.com/questions/1892324/why-program-functionally-in-python/1892614#1892614) очень поучительный. Кроме того, если вы хотите знать, является ли один подход более эффективным, чем другой, используйте [timeit] (http://docs.python.org/library/timeit.html). –

ответ

5

Вы не можете назначить в lambda, но lambda просто сокращение для функции, чтобы вы могли:

def set_it(x): 
    x.attribute = new_value 
map(set_it, li) 

по сравнению с очевидным:

for x in li: 
    x.attribute = new_value 

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

+0

спасибо .. Вторая часть ответа - это то, что я искал, хотя мой пример в вопросе был очень плохим: D – Graddy

0

Ваш подход не будет работать. Невозможно присвоить значение в конструкции lambda.

+1

О, я прошу отличить: 'lambda x: setattr (x, 'attribute', NewValue)'. –

Смежные вопросы