На самом деле это интересная тема из жемчуга программирования, сортировка 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)
Я протестировал размер массива от 100 до 10 000 000 в своем macbook (2 ГГц Intel Core 2 Duo 2 ГБ SDRAM), результат следующий:
- размер test_data: 1000
- функция sort принимает 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
- функция sort принимает 12.9204008579
- Функция vec_sort занимает 38,8053860664
Что меня разочаровывает, так это то, что даже когда размер test_data равен 100 000 000, функция сортировки все равно работает быстрее, чем vec_sort. Есть ли способ ускорить функцию vec_sort?