Itertools是个好方法。作为替代方案,纯numpy方案(0,1,…,n项的所有乘积):from numpy import *
a,n=array(l),len(l)
where(bitwise_and.outer(arange(2**n),2**arange(n))>0,a,1).prod(1)
#array([ 1, 2, 3, 6, 5, 10, 15, 30, 7, 14, 21, 42, 35, 70, 105, 210])
在大名单上快40倍。在
一些解释:
bitwise_and.outer(arange(2**n),2**arange(n))是
^{pr2}$
where(bitwise_and.outer(arange(2**n),2**arange(n))>0,a,1)是array([[1, 1, 1, 1],
[2, 1, 1, 1],
[1, 3, 1, 1],
[2, 3, 1, 1],
[1, 1, 5, 1],
[2, 1, 5, 1],
[1, 3, 5, 1],
[2, 3, 5, 1],
[1, 1, 1, 7],
[2, 1, 1, 7],
[1, 3, 1, 7],
[2, 3, 1, 7],
[1, 1, 5, 7],
[2, 1, 5, 7],
[1, 3, 5, 7],
[2, 3, 5, 7]])
然后按行prod。在