Можно ли ускорить данный код на Python?

Считается, что стандартные библиотеки даже в узких тематиках быстрее, чем свои функции. Решил проверить, написал свой код для сортировки массивов чисел. Работает алгоритм наравне со встроенным, даже на очень больших массивах, но все же процентов на 30 проигрывает по времени выполнения. Может кто-то сможет подсказать варианты более быстрой реализации кода? Просто самому интересно. Спасибо

def my_sort_count_new_5(data):
    # будет содержать конечный вывод
    data2 = []
    # будет использована для поиска максимального числа в массиве
    # вначале равно первому элементы массива
    Nmax = data[0]
    # этот вспомогательный массив длиною до максимального числа во входящем массиве
    # в нем будем считать, сколько раз каждое из чисел входит в начальный массив 
    my_work_list = [0] * (Nmax + 1)
    # идем по массиву
    for i in data:
        # если число больше максимального, расширяем длину вспомогательного массива до нового максимума 
        # и обновляем переменную максимума
        if i > Nmax:
            my_work_list.extend([0] * (i - Nmax))
            Nmax = i
        # увеличиваем во вспомогательном массиве счеткик вхождения числа в начальный массив
        my_work_list[i] += 1

#    for i, с in enumerate(my_work_list):
#        if с == 0: continue
#        data2.extend([i] * с)
    # перебираем все числа до максимального и формируем новый массив, уже отсортированный
    for i in range(Nmax+1):
        #if my_work_list[i] == 0: continue
        # добавляем слева в массив число 'i' my_work_list[i] раз
        data2.extend([i] * my_work_list[i])
    return data2

# число чисел в массиве
I = 300000
# выводим на экран для удобства
print(I)
# формируем массив
my_list = [randint(0,100) for i in range(1,I)]

#--------замеры----------------------------------
# копируем наш массив в новую переменную для предотвращения случайного изменения при дальнейшей работе
random_list_of_nums = list(my_list)
print(f'my_sort_count_new_5: {timeit.timeit("my_sort_count_new_5(random_list_of_nums)", setup="from __main__ import my_sort_count_new_5, random_list_of_nums", number=100)}')

random_list_of_nums = list(my_list)
print(f'sorted: {timeit.timeit("sorted(random_list_of_nums)", setup="from __main__ import random_list_of_nums", number=100)}')

Код писал на черновик, оформление не совсем по ГОСТу. Данный алгоритм - лучший из десятков, которые я перебрал и написал. Остальные отстают от std: sorted в десятки и сотни раз. Некоторые известные даже не дождался.

Код полностью мой, не судите строго. Вариантов исполнения было очень много, но этот у меня самый быстрый, хотя чувствую, что что-то можно улучшить.

На стареньком Vaio имеем результаты (на хорошей машине на много быстрее):

  1. 3000 my_sort_count_new_5: 0.0931307 sorted: 0.045271599999999995

  2. 30000 my_sort_count_new_5: 0.9636939999999999 sorted: 0.6915224

  3. 300000 my_sort_count_new_5: 11.324975499999999 sorted: 5.153224900000001

  4. 3000000 my_sort_count_new_5: 96.203714 sorted: 53.3571046

Всем еще раз спасибо.


Ответы (0 шт):