python - python 中大型列表操作的性能更高

标签 python image list performance

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

这是一个图像编辑软件,图像是一个大型的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/

相关文章:

Javascript 图像平移/缩放

python - 如何使用 Python 沿着带有矩形边界框的 Blob /轮廓的主轴裁剪图像

c# - 仅使用以另一个组合框中所选项目第一个字符开头的结果填充组合框

python - 在 mac 10.8.5 上安装 pycurl 时遇到问题

python - Python 中的聊天机器人数据库

python - MongoDB - 显示数据库中的所有文件

python : local variable referenced before assignment error

java - 如何从静止帧创建动画图像?

c# - 数据绑定(bind)到 List - 查看 ListBox、ComboBox 中数据源的变化

c++ - 给定一个未知长度的列表,通过仅扫描 1 次返回其中的随机项目