我想学习合并排序,但我不确定我是否正确。它的工作原理和我试图优化这个例如与leftpop deques,但我仍然得到的时间比内置sorted()函数慢大约4倍。这是否应该发生?还是我错过了一些明显的瓶颈?蟒蛇Mergesort - 太慢?
import random
from time import time
from collections import deque
unsorted = [random.randint(0, 1000) for r in xrange(101101)]
def merge_sort(unsorted_list):
length = len(unsorted_list)
if length <= 1:
return unsorted_list
left = unsorted_list[:length/2]
right = unsorted_list[length/2:]
left_sorted = deque(merge_sort(left))
right_sorted = deque(merge_sort(right))
new = []
while left_sorted and right_sorted:
if left_sorted[0] < right_sorted[0]:
new.append(left_sorted.popleft())
if not left_sorted:
new += right_sorted
else:
new.append(right_sorted.popleft())
if not right_sorted:
new += left_sorted
return new
s = time()
print merge_sort(unsorted)
e = time()
print e - s
s = time()
print sorted(unsorted)
e = time()
print e - s
编辑:下面一个有点优化版本:
def merge_sort(unsorted_list):
length = len(unsorted_list)
if length <= 1:
return unsorted_list
left = unsorted_list[:length/2]
right = unsorted_list[length/2:]
left_sorted = deque(merge_sort(left))
right_sorted = deque(merge_sort(right))
new = []
new_append = new.append
left_pop = left_sorted.popleft
right_pop = right_sorted.popleft
while left_sorted and right_sorted:
if left_sorted[0] < right_sorted[0]:
new_append(left_pop())
else:
new_append(right_pop())
if not left_sorted:
new += right_sorted
if not right_sorted:
new += left_sorted
return new
比高度优化的内建C函数慢4倍。 –
该死的你是对的。我完全忘了CPython不是用Python编写的。那么,至少这里是一些谷歌mergesort python的代码。 – iknownothing
我投票结束这个问题作为题外话,因为这应该进入CodeReview.Stackexchange.com – Prune