我正在为一个大学项目开发一个小型软件,但是我遇到了一个问题:代码的性能太低了。
它是图像编辑软件,图像是较大的3d列表(主列表是整个图像,其中的每个列表是一条水平线,其中的每个列表是一个像素,包含三个元素)。 / p>
我需要进行逐像素调整,例如将所有这些都乘以一个常数,这样就可以了
for y in range(0,len(image)):
for x in range (0,len(image[0])):
for c in range (0,3):
im[y][x][c] = (im[y][x][c])*a
image
是3d列表的地方
len(image)
是图像中水平线的数量(垂直尺寸)
len(image[0])
是水平线上的像素数量(水平大小)
c
是像素的组成部分(从0到2)。
此循环需要几分钟才能浏览一张12 MP图像,并且我必须处理的图像数量约为数百,因此这是不可能的。
我该怎么做才能获得更好的性能?甚至编辑软件也要花费几秒钟,因为它可能是一个相当大的操作,但是这段代码太慢了。
谢谢!
答案 0 :(得分:0)
我也(如评论中)建议使用Numpy。 示例代码如下:
import numpy as np
im = np.array(image,dtype="float16")
# Define your custom function
def myFunc(x,a):
x = x * a
return x
# Vectorise function
vfunc = np.vectorize(myFunc)
# Apply function to the array with the parameter a = 5
im = vfunc(im,5)
我比较了向量化numpy函数的时序和嵌套循环的大小,该数组的大小大致相当于12MP图像:4242 x 2828 x 3。
嵌套循环花了 99 秒,而numpy花了 6.5 秒。
这里有一个有关numpy函数效率的问题供您参考:Most efficient way to map function over numpy array
对于简单的函数(如使用numpy本机函数的乘法),最快。
# Multiply each element by 5
im = im * 5
此代码在我的计算机上仅用了0.5秒。