Itertools is a good way. As an alternative solution, pure numpy is used (all products 0,1, ..., n terms):
from numpy import *
a,n=array(l),len(l)
where(bitwise_and.outer(arange(2**n),2**arange(n))>0,a,1).prod(1)
up to 40 times faster on large lists.
Some explanation:
bitwise_and.outer(arange(2**n),2**arange(n)) is an
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 2, 0, 0],
[1, 2, 0, 0],
[0, 0, 4, 0],
[1, 0, 4, 0],
[0, 2, 4, 0],
[1, 2, 4, 0],
[0, 0, 0, 8],
[1, 0, 0, 8],
[0, 2, 0, 8],
[1, 2, 0, 8],
[0, 0, 4, 8],
[1, 0, 4, 8],
[0, 2, 4, 8],
[1, 2, 4, 8]], dtype=int32)
where(bitwise_and.outer(arange(2**n),2**arange(n))>0,a,1) is an
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]])
Then prodalong the line.