@Bergis

Как максимально ускорить код?

Подскажите как можно максимально ускорить код используя все возможные методы python
у меня есть код в котором я пытаюсь максимально ускорить работу функции bubble :
import random
import time
import numpy as np
from numba import njit
from numba import config, njit, threading_layer, set_num_threads, cuda
import threading




config.THREADING_LAYER = 'threadsafe'

nthreads = 12
all_time = 0.0
all_numbers = 0.0
N = 500
#Функция

@njit(fastmath=True,nopython=True,nogil=True, cache=True,parallel = True )
def bubble(array, len):
    for i in range(len):
        for j in range(0, len-i-1):
            if array[j] > array[j+1]:
                temp = array[j]
                array[j] = array[j+1]
                array[j+1] = temp

def num():
	global all_time
	global all_numbers

	int_numbers = []

	#Запись рандомов
	f = open("1.txt", 'w')
	for i in range(N):
		f.write(str(random.randint(1, 10000)) + ' ')
	f.close()

	#чтение рандомов
	f = open("1.txt", 'r')
	numbers = f.read().split(' ')
	f.close()

	#Перевод рандомов в инт
	for i in numbers:
		try:
			int_numbers.append(int(i))
		except:
			pass
	#Сортировка
	start = time.time()
	bubble(int_numbers, len(int_numbers))
	end = time.time() - start
	print(end)
	print(np.mean(int_numbers))

	#Запись сортировки
	f = open("2.txt", 'w' , encoding = 'UTF-8')
	for i in int_numbers:
		f.write(str(i) + ' ')
	f.write("\n---Выполнение заняло  %s секунд ---  " % (time.time() - start))
	f.write(str(np.mean(int_numbers)))
	#подсчет
	all_time = all_time + time.time() - start
	all_numbers = all_numbers + np.mean(int_numbers)



for i in range(50):
	num()

print(all_time/50)
print(all_numbers/50)


На данный момент лучший средний результат 0.003 секунды .
Как можно сделать код еще более быстрым ?
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
@kamenyuga
Вот пример стандартного ускорения питонячего кода с помощью нампай и намбы, наверное, абсолютный максимум ускорения питона малой кровью, без серьезного рефакторинга. Результат ускорения - примерно в 500 раз. Абсолютное время работы кода не имеет смысла, т.к. напрямую зависит от производительности пк и параметров данных - количество, тип и т.д.

import random
import numba as nb
import numpy as np


def bubble1(array):
    len_ = len(array)
    for i in range(len_):
        for j in range(len_ - i - 1):
            if array[j] > array[j + 1]:
                temp = array[j]
                array[j] = array[j + 1]
                array[j + 1] = temp


@nb.njit(parallel=True)
def bubble2(array):
    len_ = len(array)
    for i in nb.prange(len_):
        for j in nb.prange(len_ - i - 1):
            if array[j] > array[j+1]:
                array[j], array[j + 1] = array[j + 1], array[j]


if __name__ == '__main__':

    arr1 = random.choices(range(1000), k=1000)
    arr2 = np.array(arr1)

    bubble1(arr1)
    bubble2(arr2)

"""
%timeit bubble1(arr1)
46.1 ms ± 71.5 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit bubble2(arr2)
82.4 µs ± 678 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
"""
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
Заменить тип сортировки на quick sort
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы