我写这个是为了计算排序算法的平均运行时间, 如果有办法将这种方法重构为更简单或更好的东西,我只是很好奇。
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)
答案 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))