纯Python无法做到这一点(即不删除for循环)。Python的for循环结构有太多的东西要处理,因此速度不够快。如果您确实想保留for循环,唯一的解决方案是使用numba或cython,但这些工具也有其自身的问题。通常,这类循环会使用C/C++编写(在我看来是最直接的方式),然后从Python中调用,其主要作用是一个脚本语言。
虽然如此,opencv + numpy提供了足够的有用程序,可以在90%的情况下简单地使用内置函数,而无需编写自己的像素级代码。
这里是一个使用numba的解决方案,而不改变您的循环代码。在我的电脑上,它比纯Python快大约150倍。
import numpy as np, cv2 as cv
from time import time
from numba import jit,int_,uint8
@jit(argtypes=(uint8[:,:,:],int_[:]),
locals=dict(intensity=int_),
nopython=True
)
def numba(img,bins):
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
intensity = 0
for k in range(0, len(img[i][j])):
intensity += img[i][j][k]
bins[intensity/3] += 1
def python(img,bins):
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
intensity = 0
for k in range(0, len(img[i][j])):
intensity += img[i][j][k]
bins[intensity/3] += 1
img = cv.imread("image.jpg")
bins = np.zeros(256, np.int32)
t0 = time()
numba(img,bins)
t1 = time()
print t1 - t0
bins[...]=0
t0 = time()
python(img,bins)
t1 = time()
print t1 - t0
for
循环,您的算法执行时间为O(n^3),非常缓慢。 - geofffor k in img[i][j]: intensity += k
。循环range(len(...))
永远不是一个好兆头。更好的方法是使用sum(img[i][j])
并完全消除循环。 - Mark Ransom