Эффективно вычисляемая сумма квадратов разностей

Это цикл для извлечения значений RGB двух изображений и вычисления суммы квадратов различий во всех трех каналах. Запуск этого кода прямо в моем main.py занимает 0.07 сек. Скорость уменьшается до 1 сек, если вместо этого я запускаю ее в этом .pyx-файле. Я читал о функциях cdef, но тогда я не имел успеха в передаче массивов. Любая помощь по преобразованию этой функции в функцию cdef будет оценена по достоинству. Мне действительно нужен этот цикл, чтобы идти как можно быстрее.

from cpython cimport array import array import numpy as np cimport numpy as np def fittnes(Orginal, Mutated): Fittnes = 0 for x in range(0, 299): for y in range(0, 299): DeltaRed = (Orginal[x][y][0] - Mutated[x][y][0]) DeltaGreen = (Orginal[x][y][1] - Mutated[x][y][1]) DeltaBlue = (Orginal[x][y][2] - Mutated[x][y][2]) Fittnes += (DeltaRed * DeltaRed + DeltaGreen * DeltaGreen + DeltaBlue * DeltaBlue) return Fittnes 

Мой вызов функции Main.py

  NewScore = cythona.fittnes(numpy.array(Orginal), numpy.array(MutatedImage)) 

One Solution collect form web for “Эффективно вычисляемая сумма квадратов разностей”

Мне интересно узнать о числах ускорения, поэтому я отправляю это как решение. Итак, как указано / обсуждено в комментариях, если входы представляют собой массивы NumPy, вы можете использовать собственные инструменты NumPy, и в этом случае ndarray.sum() , например,

 out = ((Orginal - Mutated)**2).sum() 

Вы также можете использовать очень эффективный np.einsum для одной и той же задачи, например:

 sub = Orginal - Mutated out = np.einsum('ijk,ijk->',sub,sub) 

Тесты времени выполнения

Определить функции –

 def org_app(Orginal,Mutated): Fittnes = 0 for x in range(0, Orginal.shape[0]): for y in range(0, Orginal.shape[1]): DR = (Orginal[x][y][0] - Mutated[x][y][0]) DG = (Orginal[x][y][1] - Mutated[x][y][1]) DB = (Orginal[x][y][2] - Mutated[x][y][2]) Fittnes += (DR * DR + DG * DG + DB * DB) return Fittnes def einsum_based(Orginal,Mutated): sub = Orginal - Mutated return np.einsum('ijk,ijk->',sub,sub) def dot_based(Orginal,Mutated): # @ali_m's suggestion sub = Orginal - Mutated return np.dot(sub.ravel(), sub.ravel()) def vdot_based(Orginal,Mutated): # variant of @ali_m's suggestion sub = Orginal - Mutated return np.vdot(sub, sub) 

Сроки –

 In [14]: M,N = 100,100 ...: Orginal = np.random.rand(M,N,3) ...: Mutated = np.random.rand(M,N,3) ...: In [15]: %timeit org_app(Orginal,Mutated) ...: %timeit ((Orginal - Mutated)**2).sum() ...: %timeit einsum_based(Orginal,Mutated) ...: %timeit dot_based(Orginal,Mutated) ...: %timeit vdot_based(Orginal,Mutated) ...: 10 loops, best of 3: 54.9 ms per loop 10000 loops, best of 3: 112 µs per loop 10000 loops, best of 3: 69.8 µs per loop 10000 loops, best of 3: 86.2 µs per loop 10000 loops, best of 3: 85.3 µs per loop In [16]: # Inputs ...: M,N = 1000,1000 ...: Orginal = np.random.rand(M,N,3) ...: Mutated = np.random.rand(M,N,3) ...: In [17]: %timeit org_app(Orginal,Mutated) ...: %timeit ((Orginal - Mutated)**2).sum() ...: %timeit einsum_based(Orginal,Mutated) ...: %timeit dot_based(Orginal,Mutated) ...: %timeit vdot_based(Orginal,Mutated) ...: 1 loops, best of 3: 5.49 s per loop 10 loops, best of 3: 63 ms per loop 10 loops, best of 3: 23.9 ms per loop 10 loops, best of 3: 24.9 ms per loop 10 loops, best of 3: 24.9 ms per loop 
  • numba - guvectorize только быстрее, чем jit
  • Есть ли способ ускорить функцию аутентификации в django?
  • Почему функция numpy einsum работает быстрее, чем встроенные функции numpy?
  • Пункт номер быстрее, чем оператор
  • Самый быстрый способ найти, какой из двух списков столбцов каждой строки является истинным в рамке данных pandas
  • Как пробовать массив numpy и эффективно выполнять вычисления по каждому образцу?
  • Python: почему * и ** быстрее, чем / и sqrt ()?
  • Почему repr (int) быстрее, чем str (int)?
  • Python - лучший язык программирования в мире.