我正在为大学项目开发一个小型软件,但遇到了一个问题:代码的性能太低。
这是一个图像编辑软件,图像是一个大型的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 函数效率的问题供您引用:Most efficient way to map function over numpy array
对于乘法之类的简单函数,使用 numpy native 函数是最快的。
# Multiply each element by 5
im = im * 5
这段代码在我的机器上只花了 0.5 秒。
关于python - python 中大型列表操作的性能更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53096033/