У меня огромный список кортежей :
ijs = [(0,1),(0,2),(0,3), (3,2)...]
Для заданного значения v
я хочу получить только пары (i,j)
, которые имеют либо i=v
или j=v
(из всех возможных пар (i, j), хранящихся в ijs
).
Например, для v=0
и с учетом ijs = [(0,1),(0,2),(0,3), (3,2)]
, тогда я должен вернуться only_current = [(0,1),(0,2),(0,3)]
Пример:
Пожалуйста, не обращайте внимания на первые 3 строки, в которых я построил список ijs
с кортежами внутри.
import numpy as np
# IGNORE THIS PART UNTIL THE MAIN LOOP
N= 1000
indices_upper_triangle = np.triu_indices(N, k = 1) # k=1 above diagonal
i,j = indices_upper_triangle
ijs = [(i,j) for i,j in zip(i,j)] # create (i,j) positions
# MAIN LOOP HERE
# Main loop
all_neig_results = list()
for v in range(N): # for each point
# from all possible (i,j) pairs, get only (i,j) pairs that have either i=v or j=v
only_current = [item for item in ijs if v in item]
all_neig_results.append(only_current)
Понимание списка в l oop очень медленное.
%timeit [item for item in ijs if v in item]
15.9 s ± 361 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Если я удалю проверочный аргумент if v in item
:
%timeit [item for item in ijs]
1.28 s ± 90.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Как могу ли я оптимизировать [item for item in ijs if v in item]
?