generic xmerge ?

bonono at gmail.com bonono at gmail.com
Mon Oct 17 07:43:09 EDT 2005


million thanks. So the default compare funcion of heapq also do it like
sort ?

The size of the list is not very large but has the potential of being
run many times(web apps). So I believe second one should be faster(from
the app perspective) as it goes into the optimized code quickly without
all the overheads in the merge case.

Alex Martelli wrote:
> You can do it either way -- simplest, and pretty fast, is to concatenate
> them all and sort the result (the sort method is very good at taking
> advantage of any sorting that may already be present in some parts of
> the list it's sorting), but you can also try a merging approach.  E.g.:
>
>
> import heapq
>
> def merge_by_heap(*lists):
>   sources = [[s.next(), i, s.next]
>                     for i, s in enumerate(map(iter,lists))]
>   heapq.heapify(sources)
>   while sources:
>     best_source = sources[0]
>     yield best_source[0]
>     try: best_source[0] = best_source[-1]()
>     except StopIteration: heapq.heappop(sources)
>     else: heapq.heapreplace(sources, best_source)
>
> Now, L=list(merge_by_heap(l1, l2, l3)) should work, just as well as,
> say, L = sorted(l1+l2+l3).  I suspect the second approach may be faster,
> as well as simpler, but it's best to _measure_ (use the timeit.py module
> from the standard library) if this code is highly speed-critical for
> your overall application.
> 
> 
> Alex




More information about the Python-list mailing list