【发布时间】:2013-11-16 03:36:58
【问题描述】:
我正在使用 Python 2.7.4 创建一个简单的绿屏应用程序,但结果很慢。我目前正在使用 PIL 1.1.7 来加载和迭代图像,并看到从旧的 getpixel() 到新的 load() 和像素访问对象索引的巨大加速变化。然而,对于分辨率约为 720p 的图像,以下循环仍需要大约 2.5 秒的时间运行:
def colorclose(Cb_p, Cr_p, Cb_key, Cr_key, tola, tolb):
temp = math.sqrt((Cb_key-Cb_p)**2+(Cr_key-Cr_p)**2)
if temp < tola:
return 0.0
else:
if temp < tolb:
return (temp-tola)/(tolb-tola)
else:
return 1.0
....
for x in range(width):
for y in range(height):
Y, cb, cr = fg_cbcr_list[x, y]
mask = colorclose(cb, cr, cb_key, cr_key, tola, tolb)
mask = 1 - mask
bgr, bgg, bgb = bg_list[x,y]
fgr, fgg, fgb = fg_list[x,y]
pixels[x,y] = (
(int)(fgr - mask*key_color[0] + mask*bgr),
(int)(fgg - mask*key_color[1] + mask*bgg),
(int)(fgb - mask*key_color[2] + mask*bgb))
我在这里做的事情是不是效率非常低,导致运行如此缓慢?我见过类似的、更简单的例子,例如循环被布尔矩阵替换,但在这种情况下,我看不到替换循环的方法。
pixel[x,y] 分配似乎花费的时间最多,但我不太了解 Python,我不确定是否有更有效的方法来做到这一点。
任何帮助将不胜感激。
【问题讨论】:
-
一个小的改进是使用 xrange 代替 range
-
感谢这让它稍微提高了速度
-
通常速度下降来自于单个像素访问。您能否对所有计算进行矢量化以将代码简化为几条不带循环的语句?或者,哪一行导致执行速度慢?一旦您知道哪条线路最慢,您就可以尝试更改它们。
标签: python optimization python-2.7 python-imaging-library