Вложенный для оптимизации цикла в python

#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), несмотря ни на что…