#python #loops #optimization
#python #циклы #оптимизация
Вопрос:
я хочу оптимизировать 2 цикла for в один цикл for, есть ли какой-либо способ, поскольку длина массива очень велика.
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. Чего именно вы пытаетесь достичь?
2. Действительно ли вы хотите, чтобы ваш код выполнялся именно так? Вывод этого фрагмента в порядке?
3. Что это между второй и третьей запятой в
A
: числа2
и6
или число26
? Как и сейчас, ваш код остановится с синтаксической ошибкой.
Ответ №1:
не лучше, но более pythonic:
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), несмотря ни на что…