【问题标题】:Is there a way to speed up a nested for loop in python?有没有办法加快python中的嵌套for循环?
【发布时间】:2020-09-14 06:36:18
【问题描述】:

我只是想知道是否有一种方法可以加快 Python 中 for 循环的性能。

for i in range (0,img.shape[0],new_height):
    for j in range(0,img.shape[1],new_width):
        cropped_image = img[i:i+new_height,j:j+new_width]
        yuv_image = cv2.cvtColor(cropped_image,cv2.COLOR_BGR2YUV)
        Y,U,V = cv2.split(yuv_image)
        pixel_image_y = np.array(Y).flatten()

【问题讨论】:

  • 如果你的代码有效,这篇文章属于codereview.stackexchange.com
  • 谢谢我不知道这个网站!
  • @azro 通常,使用numpymatlab 标签来加速涉及重写以包含矢量化的代码的问题被认为是合理的主题。
  • img.shape[0] 可以被new_height 整除吗?width 也一样?
  • 我所能做的就是多处理。

标签: python python-3.x performance numpy opencv


【解决方案1】:

将整个图像转换为YUV空间后,我们可以简单地重塑成那些更小的块-

m,n = img.shape[:2]
yuv = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
yuv4D = yuv[...,0].reshape(m//new_height,new_height,n//new_width,new_width)
out = yuv4D.swapaxes(1,2).reshape(-1,new_height*new_width)

1024x1024 RGB 图像的时序 -

In [157]: img = np.random.randint(0,256,(1024,1024,3)).astype(np.uint8)
     ...: new_height,new_width = 32,32

In [158]: %%timeit
     ...: out = []
     ...: for i in range (0,img.shape[0],new_height):
     ...:     for j in range(0,img.shape[1],new_width):
     ...:         cropped_image = img[i:i+new_height,j:j+new_width]
     ...:         yuv_image = cv2.cvtColor(cropped_image,cv2.COLOR_BGR2YUV)
     ...:         Y,U,V = cv2.split(yuv_image)
     ...:         pixel_image_y = np.array(Y).flatten()
     ...:         out.append(pixel_image_y)
11.9 ms ± 991 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [159]: %%timeit
     ...: m,n = img.shape[:2]
     ...: yuv = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
     ...: yuv4D = yuv[...,0].reshape(m//new_height,new_height,n//new_width,new_width)
     ...: out1 = yuv4D.swapaxes(1,2).reshape(-1,new_height*new_width)
1.48 ms ± 5.23 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2020-07-02
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多