2017-09-21 6 views
-1

2 개의 중첩 된 루프가 Python에서 매우 느리게 작동한다는 것을 알았습니다. CPU 부하는 약 0 %를 유지하지만 여전히 느리게 작동합니다. 왜? 어떻게 해결할 수 있습니까?중첩 된 루프는 Python에서 너무 느리게 작동합니다.

초기화 (그것이 빨리 작동하도록 언급 안) :

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 분을 기다린다).

내가 제공된 코드에 주석을 달면 모든 것이 입니다.

+1

1) 알고리즘 수정, 2) numpy 사용 3) CPython 사용은 모든 옵션입니다. 더 많은 정보가 없으면 무엇이든 말하기가 어렵습니다. –

+1

해당 변수에 대한 정보가 없거나 CPU 부하 평가가 제공됩니다 ... – sascha

+1

항상, 항상 *, ** 항상 ** 모든 요소에 대해 작업을 수행 할 때 NumPy를 사용하십시오. 배열. – o11c

답변

1

코드를 수정하려면 벡터화를 사용하십시오. 그런 :

result[:,:,0] = a 
+0

좋은 아이디어! 하지만 여전히 하나의 루프를 사용해야합니다. – Dmitry

1

할당 메모리는 항상 모든 언어에서 느린, 그래서 당신은 그것을 피할 필요가있다. 귀하의 예에서는 모든 루프에 list을 생성합니다.

당신은 다음과 같은 것을 사용해야합니다

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

중요한 점은 메모리를 할당 동적으로 방지하는 것입니다 :

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에서 언급 한 바와 같이, 당신은 사용해야합니다

.

+0

이미 코드의 첫 번째 버전을 직접 사용해 보았습니다. 그것은 조금만 도움이되었습니다. – Dmitry

+0

@ 드미트리 두 번째 시도해보십시오. 많은 도움이됩니다. – Sraw