我正在为一个大学项目开发一个小软件,但我遇到了一个问题:代码的性能太低了。
它是一个图像编辑软件,图像是一个 larg 3d 列表(主列表是整个图像,它中的每个列表都是一条水平线,里面的每个列表都是一个像素,包含三个元素)。
我需要逐像素调整,例如将它们全部乘以一个常量,所以它会像
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 图像,而我必须处理的图像数量约为数百张,所以这是不可能的。
我该怎么做才能获得更好的性能?甚至编辑软件也需要几秒钟,因为它可能是一个非常大的操作,但这段代码太慢了。
谢谢!
我也(如评论中)建议使用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 函数效率的问题:在 numpy 数组上映射函数的最有效方法
对于简单的函数,如乘法,使用 numpy 本机函数是最快的。
# Multiply each element by 5
im = im * 5
这段代码在我的机器上只花了 0.5 秒。