实际上,这是一个来自编程珍珠的有趣话题,使用有效的算法在有限的内存中对 10 位电话号码进行排序。你可以在这里找到整个故事
我感兴趣的是在 python 中实现的速度有多快。我用模块位向量做了一个简单的实现。代码如下:
from BitVector import BitVector
import timeit
import random
import time
import sys
def sort(input_li):
return sorted(input_li)
def vec_sort(input_li):
bv = BitVector( size = len(input_li) )
for i in input_li:
bv[i] = 1
res_li = []
for i in range(len(bv)):
if bv[i]:
res_li.append(i)
return res_li
if __name__ == "__main__":
test_data = range(int(sys.argv[1]))
print 'test_data size is:', sys.argv[1]
random.shuffle(test_data)
start = time.time()
sort(test_data)
elapsed = (time.time() - start)
print "sort function takes " + str(elapsed)
start = time.time()
vec_sort(test_data)
elapsed = (time.time() - start)
print "sort function takes " + str(elapsed)
start = time.time()
vec_sort(test_data)
elapsed = (time.time() - start)
print "vec_sort function takes " + str(elapsed)
我在我的 macbook(2GHz Intel Core 2 Duo 2GB SDRAM)中测试了 100 到 10,000,000 的阵列大小,结果如下:
- test_data 大小为:1000
- 排序函数需要 0.000274896621704
vec_sort 函数需要 0.00383687019348
test_data 大小为:10000
- 排序函数需要 0.00380706787109
vec_sort 函数需要 0.0371489524841
test_data 大小为:100000
- 排序函数需要 0.0520560741425
vec_sort 函数需要 0.374383926392
test_data 大小为:1000000
- 排序函数需要 0.867373943329
vec_sort 函数需要 3.80475401878
test_data 大小为:10000000
- 排序函数需要 12.9204008579
- vec_sort 函数需要 38.8053860664
令我失望的是,即使 test_data 大小为 100,000,000,sort 函数仍然比 vec_sort 快。有什么方法可以加速 vec_sort 功能?