简体   繁体   English

Python timeit.timeit - 排序的片段版本比使用 lambda 运行得更快,为什么?

[英]Python timeit.timeit - snippet version of sort runs faster than using lambda, why?

I'm trying to measure the time of sorting using timeit.timeit for code in two versions - snippet or normal using lambda:我正在尝试使用 timeit.timeit 测量两个版本中代码的排序时间 - 使用 lambda 的代码片段或正常:

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
'''

and normal:和正常:

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

When i run timeit.timeit(stmt=bubble, number=1000) it give me result of 0.00026829999978872365 but when I use当我运行timeit.timeit(stmt=bubble, number=1000)它给我的结果 0.00026829999978872365 但是当我使用

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

it gives 0.04926030000024184 which is much slower.它给出了 0.04926030000024184 这要慢得多。 Can someone explain me why?有人可以解释我为什么吗?

To confirm @Craig's astute observation, actually calling the function within the snippet version confirms they're pretty much exactly as fast.为了确认@Craig 的敏锐观察,实际上在代码片段版本中调用 function 确认它们几乎完全一样快。

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))

And, of course, that you shouldn't be rolling your own bubble sort except for practice.而且,当然,除了练习之外,您不应该滚动自己的冒泡排序。

0.569853096
0.5863851120000001
0.00920665399999998

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM