Python 为什么我的排序代码的执行时间不一致?

Python 为什么我的排序代码的执行时间不一致?,python,performance,sorting,time,Python,Performance,Sorting,Time,我正在学习python,并实现了一种快速排序算法(类似于)。我知道python的sort()方法会更快,但我想知道速度有多快,所以我使用了timeit模块进行比较 我为sort()方法创建了一个“wrapper”函数,使其与我的实现使用相同的语法(并且不再是就地排序),并调用timeit。对这两个函数重复(32000) 以下是我的函数的结果: [0.00019502639770507812, 0.00037097930908203125, 0.00013303756713867188] 对于p

我正在学习python,并实现了一种快速排序算法(类似于)。我知道python的
sort()
方法会更快,但我想知道速度有多快,所以我使用了
timeit
模块进行比较


我为
sort()
方法创建了一个“wrapper”函数,使其与我的实现使用相同的语法(并且不再是就地排序),并调用
timeit。对这两个函数重复(32000)

以下是我的函数的结果:

[0.00019502639770507812, 0.00037097930908203125, 0.00013303756713867188]
对于python的sort():

正如您所看到的,python算法的执行时间比我自己的算法一致得多。有人知道为什么吗

代码:

import timeit
import random


def quick(lst):
    if not lst:
        return []
    else:
        first, rest = lst[0], lst[1:]
        great = []
        less = []
        for item in rest:
            great.append(item) if item >= first else less.append(item)
        return quick(less) + [first] + quick(great)

def sort(lst):
    lst.sort()
    return lst


x = [random.randint(1, 10000) for i in xrange(1, 1000)]

quick_t = timeit.Timer("'quick(x)'")

print quick_t.repeat(3, 2000)

sort_t = timeit.Timer("'sort(x)'")

print sort_t.repeat(3, 2000)

你的时机在很多方面都是错误的。首先,您的
排序
包装器仍然会改变其输入,而不是返回新列表:

>>> x = [2, 1]
>>> sort(x)
[1, 2]
>>> x
[1, 2]
第二,你根本就没有选择任何一种。您正在计时字符串literal
'quick(x)
'sort(x)
的计算。实际上没有进行排序

下面是您实际执行计时的方式:

>>> x = [random.randint(1, 10000) for i in xrange(1, 1000)]

>>> print timeit.repeat('quick(x)', 'from __main__ import quick, x', repeat=3, number=500)
[1.1500223235169074, 1.0714474915748724, 1.0657452245240506]
>>> print timeit.repeat('sorted(x)', 'from __main__ import quick, x', repeat=3, number=500)
[0.0944752552401269, 0.10085532031979483, 0.09799135718691332]

“我为sort()方法创建了一个‘包装器’函数,所以它……不再是就地排序”——呃,不是。另外,你的排序与内置排序没有什么竞争性。谢谢你提供的第一点信息。关于第二部分,下面是ideone的实际输出。我使用的
timeit
模块是否错误<代码>[0.000614881515029297,0.0005340576171875,0.000494956970214838]
[0.0005309581756591797,0.00052690598144531,0.0005059248535156]
>>> x = [random.randint(1, 10000) for i in xrange(1, 1000)]

>>> print timeit.repeat('quick(x)', 'from __main__ import quick, x', repeat=3, number=500)
[1.1500223235169074, 1.0714474915748724, 1.0657452245240506]
>>> print timeit.repeat('sorted(x)', 'from __main__ import quick, x', repeat=3, number=500)
[0.0944752552401269, 0.10085532031979483, 0.09799135718691332]