#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
Выигрывает понимание списка.