Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2021 11:15:12

SergioX13
Зарегистрирован: 2021-12-16
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация кода numpy

Данный код добавляет шум Гаусса на фото.
Возникла проблема со скоростью: фото fhd обрабатывается около 0,45 секунд. Для моих задач это непозволительно. Необходимо достичь скорости хотя бы единиц миллисекунд.

 import numpy as np
import cv2
image = cv2.imread('1.jpg')
row,col,ch= image.shape
mean = 0
var = 0.1
sigma = var**0.5
gauss = np.random.normal(mean,sigma,(row,col,ch))
gauss = gauss.reshape(row,col,ch)
noisy = image + gauss
cv2.imwrite('2.jpg', noisy)


Уже оптимизировал самую медленную часть кода(генерацию массива рандомных чисел)(данная операция занимает окооло 0,32с):
 gauss = np.random.normal(mean,sigma,(row,col,ch))
gauss = gauss.reshape(row,col,ch

Уменьшил матрицу в сто раз, а потом размножил в сто раз:
 roww=int(row/100)
b = timeit.default_timer()
gauss = np.random.normal(mean,sigma,(roww,col,ch))
gauss = gauss.reshape(roww*col*ch)
gauss = np.tile(gauss, 100)
gauss = gauss.reshape(row,col,ch)
Код выше выполняется 20мс, из которых больше всего времени занимает размножение одной матрицы в большую(18мс):
 gauss = np.tile(gauss, 100)
Как можно было бы сделать данную операцию быстрее?

А теперь к основной проблеме: весь этот код по-прежнему выполняется очень долго(170мс),самые времязатратные операции:

Сложение матриц занимает 30мс.
 noisy=image+gauss

Открытие(35мс) и сохранение(90мс) фото:
 image = cv2.imread("1.jpg"
 cv2.imwrite('2.jpg', noisy)

Можно ли эти операции как-либо ускорить на python?
Спасибо!


Полный код:
 import numpy as np
import cv2
image = cv2.imread('1.jpg')
row,col,ch= image.shape
mean = 0
var = 0.1
sigma = 10
roww=int(row/100)
gauss = np.random.normal(mean,sigma,(roww,col,ch))
gauss = gauss.reshape(roww*col*ch)
gauss = np.tile(gauss, 100)
gauss = gauss.reshape(row,col,ch)
noisy=image+gauss
cv2.imwrite('2.jpg', noisy)

Офлайн

#2 Дек. 18, 2021 06:58:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Оптимизация кода numpy

SergioX13
Можно ли эти операции как-либо ускорить на python?
C 450 до 1-2 миллисекунд?
А с чего вы вдруг решили что это вообще возможно? На любом языке, даже на ассемлере если будете писать, есть физические пределы вашей аппаратуры.

Если вы напишете на C чтение вашего файла в память, то увидите что оно занимает теже 30 мс. и циферки определяются тем что с жесткого диска данные читаются со скоростью 100-60 мб в секунду и ваш файл физически не может быстрее прочитаться.

Сравните 30 мс с 1 мс которую вы хотите и успокойтесь. Достигнуть желаемого вами быстродействия на вашем железе невозможно.

Расклад тут такой. numpy по сути это вызовы круто оптимизированного кода на C. Для вашего кода переход на С даст ну 1-10 процентов прироста производительности. Можно распараллелить расчеты, это даст 3-5 раз в скорости обработки в зависимости от того что у вас за процессор. И вы при этом упретесь не в расчет а в скорость считывания и записи, поскольку этот девайс у вас один. После этого вы можете купить SSD и работать на нем. Это может дать вам 2-3 раза на операциях ввода вывода и вы упретесь в пропускную способность шины на материнской плате.

После этого можете арендовать компы на ЦОДЕ. в принципе 200-300 штук будет достаточно. Правда вы ничего не выиграете поскольку поскольку после этого основные затраты будут на пересылку по интернету.

Когда вы заменили случайную матрицу на тайлы то это называется не оптимизация, а вообще подмена задачи. Результат вы другой получаете. Подмена может дать любое ускорение, например если ничего не делать.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version