2016-10-16 4 views
-1

하나의 for 루프에 2 개의 루프를 최적화하고 싶습니다. 배열의 길이가 매우 길기 때문에 어떤 방식 으로든 존재합니다.파이썬에서 루프 최적화를 위해 중첩

A = [1,4,2 6,9,10,80] #length of list is very large 
B = [] 
for x in A: 
    for y in A: 
     if x != y: 
      B.append(abs(x-y)) 
print(B) 
+1

정확히 달성하려는 것은 무엇입니까? –

+0

정말 코드를 실행하는 방식입니까? 해당 스 니펫의 출력은 괜찮습니까? –

+0

'A'의 두 번째 쉼표와 세 번째 쉼표 사이의 값은 '2'와 '6'또는 26이라는 숫자입니까? 이제는 구문 오류로 인해 코드가 중지됩니다. –

답변

1

되지 않은 더 나은하지만 더 파이썬 :

B = [abs(x-y) for x in A for y in A if x!=y] 

당신이 절대적으로 중복 (abs(a-b) == abs(b-a))가 필요하지 않는 한 수의 절반 목록 (및 계산) : 마침내

B = [abs(A[i]-A[j]) for i in range(len(A)) for j in range(i+1, len(A))] 

당신이 numpy의 힘을 사용하여 C++ 속도 향상 :

import numpy as np 

A = np.array(A) 
A.shape = -1,1 # make it a column vector 

diff = np.abs(A - A.T) # diff is the matrix of abs differences 

# grab upper triangle of order 1 (i.e. less the diagonal) 
B = diff[np.triu_indices(len(A), k=1)] 

하지만 이건 항상 O (n^2)가 될 것입니다 ...

관련 문제