лямбда в сравнении со списком производительности

Недавно я опубликовал вопрос с использованием лямбда-функции, и в ответ кто-то упомянул, что лямбда выходит из строя, вместо этого использовать списочные выражения. Я относительно новичок в Python. Я провел простой тест:

import time

S=[x for x in range(1000000)]
T=[y**2 for y in range(300)]
#
#
time1 = time.time()
N=[x for x in S for y in T if x==y]
time2 = time.time()
print 'time diff [x for x in S for y in T if x==y]=', time2-time1
#print N
#
#
time1 = time.time()
N=filter(lambda x:x in S,T)
time2 = time.time()
print 'time diff filter(lambda x:x in S,T)=', time2-time1
#print N
#
#
#http://snipt.net/voyeg3r/python-intersect-lists/
time1 = time.time()
N = [val for val in S if val in T]
time2 = time.time()
print 'time diff [val for val in S if val in T]=', time2-time1
#print N
#
#
time1 = time.time()
N= list(set(S) & set(T))
time2 = time.time()
print 'time diff list(set(S) & set(T))=', time2-time1
#print N  #the results will be unordered as compared to the other ways!!!
#
#
time1 = time.time()
N=[]
for x in S:
    for y in T:
        if x==y:
            N.append(x)
time2 = time.time()
print 'time diff using traditional for loop', time2-time1
#print N

Все они печатают одну и ту же букву N, поэтому я прокомментировал, что выведите stmt (кроме последнего способа 'неупорядочено), но результирующие различия во времени были интересны при повторных тестах, как видно из этого примера:

time diff [x for x in S for y in T if x==y]= 54.875
time diff filter(lambda x:x in S,T)= 0.391000032425
time diff [val for val in S if val in T]= 12.6089999676
time diff list(set(S) & set(T))= 0.125
time diff using traditional for loop 54.7970001698

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

Итак, два вопроса:

Почему лямбда и т. Д. Отталкиваются?

Для способов понимания списка, есть ли более эффективная реализация и как бы вы ЗНАЛИ это?более эффективно без тестирования? Я имею в виду, что лямбда / карта / фильтр должна была быть менее эффективной из-за дополнительных вызовов функций, но, похоже, она более эффективна.

Павел

Ответы на вопрос(10)

Ваш ответ на вопрос