Python 算法的运行时在处理数据时会大大减慢

Python 算法的运行时在处理数据时会大大减慢,python,arrays,python-3.x,numpy,time-complexity,Python,Arrays,Python 3.x,Numpy,Time Complexity,这个算法是我正在进行的一个更大项目的一部分,这个算法的作用是查找给定颜色的像素,然后返回它们的坐标 def find_像素(img): labels=np.zero((len(img),len(img[0])) c=0 x0=0 尽管如此: 印刷品(c) 像素=查找像素(img,标签,x0) 如果像素[0]==False: 打破 其他: i、 j,标签,x0=像素[0][0],像素[0][1],像素[1],像素[2] c+=1 打印((i,j)) def find_pixel_v2(图像、标签、

这个算法是我正在进行的一个更大项目的一部分,这个算法的作用是查找给定颜色的像素,然后返回它们的坐标

def find_像素(img):
labels=np.zero((len(img),len(img[0]))
c=0
x0=0
尽管如此:
印刷品(c)
像素=查找像素(img,标签,x0)
如果像素[0]==False:
打破
其他:
i、 j,标签,x0=像素[0][0],像素[0][1],像素[1],像素[2]
c+=1
打印((i,j))
def find_pixel_v2(图像、标签、x0):
对于范围(x0,len(img))内的i:
对于范围(0,len(img[0])内的j:
如果标签[i][j]==1:
持续
其他:
如果img[i][j][0]!=0:
标签[i][j]=1
返回(i,j),标签,x0
其他:
标签[i][j]=1
返回False,标签
输入img是一个形状(x,y,3)的数组。 标签是一个带有形状(x,y)的零数组,以确保我不会在已检查的坐标上循环


问题是,随着时间的推移,算法的运行时间大大减慢,我不知道为什么。

我发现问题出在哪里:

运行时变慢的原因是,每次调用
find\u pixel\u v2()
,for循环从一开始就迭代整个数组,直到它到达具有所需颜色的像素,随着时间的推移,此过程将花费越来越长的时间

我想我可以使用一个变量
x0
,以防止for循环在每次调用中都重复

然而,我在这里犯了一个错误:
return(I,j),labels,x0
我返回的是相同的
x0
值,每次都是零


将这行更改为
return(i,j),labels,i
将解决这个问题,也就是说,下次调用
find_pixel_v2()
时,for循环将从上次调用结束的地方开始。

很高兴看到您发现了错误(这就是您的问题所在)。
然而,我并没有完全理解你的算法,如果我误解了什么,请纠正我

但整个过程都是关于获取图像的所有索引,其中像素的红色分量不同于零,对吗

因此,我的方法是为搜索到的像素制作一个
True
的遮罩,为所有其他像素制作一个
False
的遮罩,然后询问它们的索引:

mask = img[:, :, 0] != 0
indices = np.argwhere(mask)

也许你可以测试一下;希望这有帮助。

您在哪里指定要查找的颜色?img[i][j][0]!=0,其中img[i][j]是像素的RGB代码。为什么有时在
查找像素v2
中使用
标签,有时使用
标签?这是故意的吗?取决于标签的大小,它可能会因为标签[i][j]=1而变慢。我最近也有类似的数据帧问题。不要调整标签并一次又一次地保存它们,而是尝试使用
append
将值保存在一个不断增长的列表中,然后将它们插入到
标签中。例如
pixels.append([i,j])
为什么需要多次调用
find\u pixel\u v2
?难道你不能一次通过图像,然后收集一组左右的坐标吗?这个算法的目的是测试for循环的运行时间。最初的算法应该是得到一个不同于黑色的像素,然后捕获它附近的所有像素,这是一种检测特定颜色簇的算法。在写这篇文章之前,我对面具一无所知,我是个初学者,所以它肯定会有帮助,谢谢你指出!不客气。也许你会考虑读一些麻木文档中的段落。这是一个关于一些强大功能的有趣话题。由于我知道这些包中的图像是numpy数组,所以它可能是您的基本工具集。我一定会这样做,因为正如您提到的,它确实是我的基本工具集,谢谢!