刚才发现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分钟来获取该数据量)。
如果我对提供的代码发表评论,那么一切都可以只需一秒。
答案 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