嵌套循环在Python中运行得太慢

时间:2017-09-21 00:16:50

标签: python performance for-loop optimization nested-loops

刚才发现2个嵌套循环在Python中工作得非常慢。 CPU负载保持在0%左右,但仍然运行缓慢。为什么?我该如何解决这个问题?

初始化(不应对其进行评论以使其快速运行):

    a = imresize(image, (maxY, maxX), 'lanczos')
    b = imresize(image, (maxY * 2, maxX), 'lanczos')

慢代码:

    result = np.empty((maxY, maxX, 3), dtype=np.uint16)
    for y in range(maxY):
        for x in range(maxX):
            result[y, x] = [a[y, x], a[y, x], a[y, x]]

这个工作起来更慢:

    result = np.empty((maxY, maxX, 3), dtype=np.uint16)
    for y in range(maxY):
        for x in range(maxX):
            result[y, x] = [a[y, x], b[y*2, x], b[y*2+1, x]]

还有其他更有效的代码可以达到相同的效果吗?

a的形状是(299,299),b - (598,299),结果 - (299,299,3)。我将代码调用了大约5000次(并等待大约10分钟来获取该数据量)。

如果我对提供的代码发表评论,那么一切都可以只需一秒

2 个答案:

答案 0 :(得分:2)

在每种语言中分配内存总是很慢,因此您需要避免使用它。在您的示例中,您在每个循环中创建list

您应该使用以下内容:

result = np.empty((maxY, maxX, 3), dtype=np.uint16)
for y in range(maxY):
    for x in range(maxX):
        result[y, x, 0] = a[y, x]
        result[y, x, 1] = a[y, x]
        result[y, x, 2] = a[y, x]

或者如@ user3237718所述,您应该使用:

result = np.empty((maxY, maxX, 3), dtype=np.uint16)
for i in range(3):
    result[:, :, i] = a

关键是要避免动态分配内存。

答案 1 :(得分:1)

请使用矢量化来修复您的代码。 那样:

result[:,:,0] = a