Python timeit.timeit-スニペットバージョンのsortは、ラムダを使用するよりも高速に実行されます。なぜですか?

andrew_the_coder

2つのバージョン(スニペットまたはラムダを使用した通常のコード)のコードに対して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を与えます。誰かが私に理由を説明できますか?

AKX

@Craigの鋭敏な観察を確認するために、スニペットバージョン内で関数を実際に呼び出すと、それらがほぼ同じ速度であることが確認されます。

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ