実際、これは真珠のプログラミングからの興味深いトピックであり、効率的なアルゴリズムを使用して限られたメモリ内で 10 桁の電話番号を並べ替えます。全編はこちらからご覧いただけます
私が興味を持っているのは、実装が Python でどれだけ高速になるかということです。モジュール bitvector を使用して素朴な実装を行いました。コードは次のとおりです。
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 関数を高速化する方法はありますか?