python - 创建笛卡尔积的最快方法,对内没有重复元素

标签 python list cartesian-product

我有图像索引列表,它的长度是 60000。我想创建另一个包含随机索引对的列表。这里的约束是产品集的每个元素都应该包含不同的索引。换句话说,我不想自己将索引与它配对。

目前我一直在使用 itertools.product 方法和 for 循环。

pairs = []
for pair in itertools.product(indexes, indexes):
    if pair[0]!=pair[1]:
        pairs.append(pair)

问题是它花了很多时间,而且我无法使用我的电脑,因为它卡住了。

有更好的方法吗?

最佳答案

你可以懒惰地做而不存储它们:

pairs = filter(lambda x: x[0] != x[1], itertools.product(indexes, indexes))

如果使用 python2,请使用 itertools.ifilter

使用 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

关于python - 创建笛卡尔积的最快方法,对内没有重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518210/

相关文章:

list - 在 Prolog 中创建带圆圈的列表

python - 如何根据列表中的元素从 Python 字典中删除元素?

c# - List<List<int>>的组合

ruby - 笛卡尔幂(具有自任意次的笛卡尔积)

python - 从父类(super class)实例化子类

python - 与 Project Euler : C vs Python vs Erlang vs Haskell 的速度比较

python - 我的 Python 脚本中的奇怪输出 - [0m 或 [32m

python - Pandas : Usecols do not match columns, 列预期但未找到

python - 从字符串中提取随机字符,然后打印其余部分。

matlab - MATLAB 中的笛卡尔积