gpt4 book ai didi

python - lambda 与列表理解性能

转载 作者:IT老高 更新时间:2023-10-28 21:05:24 24 4
gpt4 key购买 nike

我最近发布了一个使用 lambda 函数的问题,在回复中有人提到 lambda 已不再受欢迎,而是使用列表推导。我对 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,所以我评论了 print stmt out(除了最后一种方式是无序的),但是在重复测试中产生的时间差异很有趣,如以下示例所示:

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

因此,虽然我发现列表推导总体上更易于阅读,但至少在此示例中似乎存在一些性能问题。

那么,两个问题:

  1. 为什么 lambda 等被搁置一旁?

  2. 对于列表理解方式,是否有更高效的实现方式?如果不进行测试,您怎么知道它更高效?我的意思是,由于额外的函数调用,lambda/map/filter 应该效率较低,但它似乎更有效。

保罗

最佳答案

您的测试正在做非常不同的事情。其中 S 为 1M 元素,T 为 300:

[x for x in S for y in T if x==y]= 54.875

此选项进行 300M 的相等比较。

 

filter(lambda x:x in S,T)= 0.391000032425

此选项通过 S 进行 300 次线性搜索。

 

[val for val in S if val in T]= 12.6089999676

此选项通过 T 进行 1M 线性搜索。

 

list(set(S) & set(T))= 0.125

此选项执行两个集合构造和一个集合交集。


这些选项之间的性能差异更多地与每个选项使用的算法有关,而不是列表推导式和 lambda 之间的任何差异。

关于python - lambda 与列表理解性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1632902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com