Python的效率itertools.product()

时间:2015-08-12 09:02:45

标签: python algorithm performance cartesian-product set-theory

因此,我正在研究计算 n 数组的笛卡尔积的不同方法,并且我遇到了使用以下代码的相当优雅的解决方案(此处为SO):

import itertools
    for array in itertools.product(*arrays):
        print array

查看itertools.product() python doc page(我使用2.7,顺便说一句)def product(*args, **kwds): # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = map(tuple, args) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod) ,它说代码等同于以下内容:

O(n^2)

(它确实注意到以下内容:此函数等效于以下代码,但实际实现不会在内存中构建中间结果:

我不是CS人员 - 所以我估计这个算法的效率非常糟糕。我的第一个猜测是$("form").submit()(由于嵌套的for循环)。

我错了吗?

1 个答案:

答案 0 :(得分:1)

您绝对正确。也就是说,在两个数组输入的特殊情况下,两个数组的大小均为 n 。在一般情况下, i 的大小为 n [ i ]的 k 数组在1 .. > k 将为O(所有 n [ i ]的乘积)。

为什么会这样,为什么没有办法进一步优化呢?

好吧,在这种情况下,输出的大小直接是“所有 n [ i ]的乘积”,这正是我们正在讨论的函数的本质。 Python通过将其实现为生成器使这一点更加明显。因此,对于每个元素,此生成器都会生成一个元素,最后,生成的元素将与所述乘积一样多。

当然,如果某件事显然做了 x 次,它的效率就不会比O( x )好。如果每个元素的工作量还取决于输入大小,则可能会更糟。因此,确切地说,此处每个元素的工作量取决于我们放入的数组的数量,因此真正的工作量将是

O( k ×所有 n [ i ])的乘积