permutations - fast & with low memory consumption?

Paul McGuire ptmcg at austin.rr._bogus_.com
Tue Dec 19 11:10:40 EST 2006


"Christian Meesters" <meesters at uni-mainz.de> wrote in message 
news:em8tlg$9ka$1 at news1.zdv.uni-mainz.de...
> Hi,
>
> I'd like to hack a function which returns all possible permutations as 
> lists
> (or tuples) of two from a given list. So far, I came up with this 
> solution,
> but it turned out to be too slow for the given problem, because the list
> passed ("atomlist") can be some 1e5 items long:
>
> def permute(atomlist, size = 2):
>    """
>        returns a list of atoms grouped by two
>    """
>    if not size or not atomlist:
>        return [atomlist[:0]]
>    else:
>        result = list()
>        for i in xrange(len(atomlist)):
>            pick = atomlist[i:i+1] # sequence slice
>            remainder = atomlist[:i] + atomlist[i+1:] # keep [:i] part
>            for x in __permute(remainder, size = size - 1):
>                result.append(pick + x)
>        return result
>
> Does anybody know a solution which consumes less memory and is possibly
> faster, perhaps using generator expressions? All my attempts so far 
> failed.
>
> Any help appreciated!
> TIA
> Christian

Am I correct in understanding that you want to find the permutations of a 
list up to 1e5 elements in length, taken 2 or more at a time?  FYI, P(1e5,2) 
evaluates to just under 10 billion, so I would suggest some implementation 
other than a function that returns a list of all of the permutations (think 
"generator").

Wikipedia also includes a pseudocode algorithm for computing permutations 
(http://en.wikipedia.org/wiki/Permutation), but beware, it appears to be 
1-based.

-- Paul






More information about the Python-list mailing list