这是一个循环,用于提取两个图像的RGB值,并计算所有三个通道的平方差之和。在我的main.py中直接运行这段代码需要0.07秒。如果我在这个.pyx文件中运行它,速度会降低到1秒。我读过关于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))发布于 2015-11-14 15:41:24
让我有兴趣知道加速比的数字,所以我张贴这作为一个解决方案。因此,正如注释中所述/讨论的那样,如果输入是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 loophttps://stackoverflow.com/questions/33709902
复制相似问题