在 python 中的大型列表操作中具有更高的性能



我正在为一个大学项目开发一个小软件,但我遇到了一个问题:代码的性能太低了。

它是一个图像编辑软件,图像是一个 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 秒。

最新更新