Python timeit.timeit - фрагментная версия сортировки работает быстрее, чем с использованием лямбды, почему? - PullRequest
1 голос
/ 06 апреля 2020

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

bubble='''
elements = [1,22,4,632,12,3432,54531,2,2,2,2,2,4,54,3,2,1,54,43,11,22,32]
def bubble_sort(elements):
    n=0
    for i in range(len(elements)-n):
        for j in range(len(elements)-1):
            if elements[j]>elements[j+1]:
                elements[j+1],elements[j] = elements[j], elements[j+1]
                n+=1
    return elements
'''

и нормальный:

elements = [1,22,4,632,12,3432,54531,2,2,2,2,2,4,54,3,2,1,54,43,11,22,32]
def bubble_sort(elements):
    n=0
    for i in range(len(elements)-n):
        for j in range(len(elements)-1):
            if elements[j]>elements[j+1]:
                elements[j+1],elements[j] = elements[j], elements[j+1]
                n+=1
    return elements

Когда я запускаю timeit.timeit(stmt=bubble, number=1000), это дает мне результат 0,00026829999978872365, но когда я использую

 t = Timer(lambda: bubble_sort(elements))
print(t.timeit(number = 1000))

, это дает 0,04926030000024184, что намного медленнее. Может кто-нибудь объяснить мне, почему?

1 Ответ

1 голос
/ 06 апреля 2020

Чтобы подтвердить проницательное наблюдение @ Крэйга, фактический вызов функции в версии фрагмента подтверждает, что они в значительной степени точно такие же быстрые.

import timeit

bubble='''
def bubble_sort(elements):
    n=0
    for i in range(len(elements)-n):
        for j in range(len(elements)-1):
            if elements[j]>elements[j+1]:
                elements[j+1],elements[j] = elements[j], elements[j+1]
                n+=1
    return elements
bubble_sort([1,22,4,632,12,3432,54531,2,2,2,2,2,4,54,3,2,1,54,43,11,22,32])
'''

def bubble_sort(elements):
    n=0
    for i in range(len(elements)-n):
        for j in range(len(elements)-1):
            if elements[j]>elements[j+1]:
                elements[j+1],elements[j] = elements[j], elements[j+1]
                n+=1
    return elements

print(timeit.timeit(stmt=bubble, number=10000))
print(timeit.timeit(stmt=lambda: bubble_sort([1,22,4,632,12,3432,54531,2,2,2,2,2,4,54,3,2,1,54,43,11,22,32]), number=10000))
print(timeit.timeit(stmt=lambda: list(sorted([1,22,4,632,12,3432,54531,2,2,2,2,2,4,54,3,2,1,54,43,11,22,32])), number=10000))

И, конечно же, вам не следует бросать собственная сортировка пузырьков, кроме практики.

0.569853096
0.5863851120000001
0.00920665399999998
...