Встроенные функции занимают больше времени выполнения, чем пользовательские функции? (Python)

#python #function #time-complexity

#python #функция #сложность по времени

Вопрос:

 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 , то почему это занимает меньше времени, чем встроенная функция? Я не могу понять, почему это происходит, поскольку оба делают одно и то же.

Определяемая пользователем функция

Встроенная функция

Комментарии:

1. Под «встроенной функцией» вы имеете в виду filter и list ?

2. Просто любопытно — почему вы вызываете свою функцию oddList , когда составляете список четных чисел? Это то, что element % 2 == 0 делает…

3. @MattDMo — вот что делает это странным

4. @tdelaney Я вижу, что ты там сделал

5. извините за неправильное название функции, но мой вопрос касается времени выполнения, поэтому это не имеет значения, я создаю нечетный список или четный список

Ответ №1:

Разница в том, что 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
  

Выигрывает понимание списка.