重构计算排序算法的运行时间 - python

时间:2017-10-06 22:24:17

标签: python algorithm python-2.7 sorting refactoring

我写这个是为了计算排序算法的平均运行时间, 如果有办法将这种方法重构为更简单或更好的东西,我只是很好奇。

time = []
for i in range(3):
    start = timeit.default_timer()
    insert_list = []
    for i in range(3000):
        insert_list.append(randint(0,5000))
    sorted_list = merge_sort(insert_list)
    stop = timeit.default_timer()
    time.append(stop - start)
print sum(time) /len(time)

2 个答案:

答案 0 :(得分:1)

尝试使用datetime来衡量算法的运行时间。

datetime.datetime具有微秒属性,如果您选择使用datetime.datetime.now()

,则可以使用该属性
   from datetime import datetime
    startTime = datetime.now()
    #CODE
    print("Time taken:",datetime.now() - startTime)

答案 1 :(得分:1)

首先,您必须在时间测量之外移动for i in range(3000)周期。这不是排序,因此您实际测量数据集总体。并且由于您使用随机数,它将高度依赖于熵源的速度(例如/ dev / random,/ dev / urandom或类似),这在某些配置中可能非常慢(例如,VM上共享主机或云端)。这与排序算法的速度无关。

time = []
for i in range(3):
    insert_list = []
    for i in range(3000):
        insert_list.append(randint(0,5000))
    start = timeit.default_timer()
    sorted_list = merge_sort(insert_list)
    stop = timeit.default_timer()
    time.append(stop - start)
print sum(time) /len(time)

其次,不是那么重要,这个计时器(以及time.time()& datetime.now())可以在时区转换,夏令时,ntp时间调整等情况下产生意外结果。使用monotonic.monotonic(),如果可能的话,它使用OS'的单调时间源。虽然,这是一个外部库,而不是内置库。

time = []
for i in range(3):
    insert_list = []
    for i in range(3000):
        insert_list.append(randint(0,5000))
    start = monotonic.monotonic()
    sorted_list = merge_sort(insert_list)
    stop = monotonic.monotonic()
    time.append(stop - start)
print sum(time) /len(time)

第三,如果您单独测量每个呼叫,测量可能会受到外部环境的影响。例如太小的数据集上的算法太快,由于时钟的精确度将导致测量舍入。相反,进行N次排序调用并测量整个周期的时间。然后将总时间除以运算次数。这是以内存为代价的,因为你必须提前准备好所有N个阵列。

N = 3
dataset = []
for i in range(N):
    insert_list = []
    for i in range(3000):
        insert_list.append(randint(0,5000))
    dataset.append(insert_list)
start = monotonic.monotonic()
for insert_list in dataset:
    sorted_list = merge_sort(insert_list)
stop = monotonic.monotonic()
print (stop - start) / N

第四,为什么不使用timeit.timeit()函数?

N = 3
dataset = [[randint(0, 5000) for j in range(3000)] for i in range(N)]
print(timeit.timeit(lambda: merge_sort(dataset.pop()), number=N))