Вы можете сделать это лениво, не сохраняя их:
pairs = filter(lambda x: x[0] != x[1], itertools.product(indexes, indexes))
Используйте itertools.ifilter
при использовании python2
Идея использования itertools заключается в том, что выне нужно предварительно вычислять все, но просить вычислить его по одному элементу (вычислению) за раз.
Я сделал сравнение времени, предложенное @Deepak Saini, то есть live here :
import numpy as np
import itertools
indexes = np.arange(1000)
def pairs(indexes):
pairs = []
for pair in itertools.product(indexes, indexes):
if pair[0]!=pair[1]:
pairs.append(pair)
return pairs
def iter_pairs(indexes):
return filter(lambda x: x[0] != x[1], itertools.product(indexes, indexes))
def iter_pairs_no_lambda(indexes):
def comp(x):
return x[0] != x[1]
return filter(comp, itertools.product(indexes, indexes))
import time
for f in (pairs, iter_pairs, iter_pairs_no_lambda):
print(f.__name__)
t1 = time.time()
res = f(indexes)
print("Took {}".format(time.time() - t1))
Что приводит к:
pairs
Took 1.012538194656372
iter_pairs
Took 0.04567384719848633
iter_pairs_no_lambda
Took 0.0002455711364746094