问题描述
import time
startTime = time.time()
def oddList(arr):
a=[]
for element in arr:
if element%2 == 0:
a.append(element)
return a
arr = [i for i in range(8)]
for i in range(1000000):
odd = (list(filter(lambda x: x%2 == 0,arr)))
# odd = oddList(arr)
endTime = time.time()
print(endTime - startTime,"utilizing the in-built method")
如果我使用用户定义的函数oddList
,为什么它比内置函数花费的时间更少?我不明白为什么会发生这种情况,因为两者都在做同一件事。
解决方法
区别在于filter
为每个比较调用lambda
函数。这意味着仅需测试x%2
就需要构造一个新的函数对象和堆栈框架。它(调用函数,比较,返回结果,比较结果)与(比较)之间的差。第三种方法是使用列表理解。重做您的测试
import time
def oddList(arr):
a=[]
for element in arr:
if element%2:
a.append(element)
return a
arr=[i for i in range(8)]
startTime = time.time()
for i in range(1000000):
odd=(list(filter(lambda x: x%2,arr)))
print("filter",time.time()-startTime)
startTime = time.time()
for i in range(1000000):
odd=oddList(arr)
print("function",time.time()-startTime)
startTime = time.time()
for i in range(1000000):
odd=[n for n in arr if n%2]
endTime=time.time()
print("comprehension",time.time() - startTime)
我知道了
filter 0.7806670665740967
function 0.5075747966766357
comprehension 0.43089747428894043
列表理解胜出。