32

Timsort is an adaptive, stable, natural mergesort. It has supernatural performance on many kinds of partially ordered arrays (less than lg(N!) comparisons needed, and as few as N-1), yet as fast as Python's previous highly tuned samplesort hybrid on random arrays.

Have you seen timsort used outside of CPython? Does it make sense?

SilentGhost
  • 307,395
  • 66
  • 306
  • 293
Constantin
  • 27,478
  • 10
  • 60
  • 79

7 Answers7

31

Yes, it makes quite a bit of sense to use timsort outside of CPython, in specific, or Python, in general.

There is currently an effort underway to replace Java's "modified merge sort" with timsort, and the initial results are quite positive.

plinehan
  • 700
  • 7
  • 17
  • 4
    Java SE 7 uses Timsort as it's sort algorithm now. See http://www.docjar.com/docs/api/java/util/Collections.html#sort(List) – Abhinav Sarkar Jul 07 '12 at 17:45
23

The algorithm is pretty generic, but the benefits are rather Python-specific. Unlike most sorting routines, what Python's list.sort (which is what uses timsort) cares about is avoiding unnecessary comparisons, because generally comparisons are a lot more expensive than swapping items (which is always just a set of pointer copies) or even allocating some extra memory (because it's always just an array of pointers, and the overhead is small compared to the average overhead in any Python operation.)

If you're under similar constraints, then it may be suitable. I've yet to see any other case where comparisons are really that expensive, though :-)

Thomas Wouters
  • 130,178
  • 23
  • 148
  • 122
  • 1
    If comparisons are expensive, then a data-specific algorithm will usually perform better than a comparison-based one. – Rafał Dowgird Oct 01 '08 at 12:53
  • 1
    That is a good observation, and indeed probably the main reason you won't see timsort or anything close to it in the wild. – Thomas Wouters Oct 01 '08 at 13:34
  • 1
    The benefits are *not* Python-specific. The same benefit of using Timsort in Python to sort a list of object references exists in any programming language which has pointers or object references. For instance, Java SE 7+, Android and Swift use Timsort to sort objects. – Alan Evangelista Nov 29 '19 at 18:17
6

It doesn't look particularly familiar, but "smart" mergesorts are pretty common out in the wide world of software.

As for whether it makes sense, that depends on what you're sorting, and the relative cost of comparisons vs. memory allocation. A sort that requires up to 2*N bytes of extra memory isn't going to be a good choice in a memory-constrained environment.

Mark Bessey
  • 19,598
  • 4
  • 47
  • 69
  • Are you talking about Timsort in your last sentence? It does not take 2*N bytes of extra memory. – Alan Evangelista Nov 29 '19 at 18:01
  • From the linked description in the original question:” + timsort can require a temp array containing as many as N//2 pointers, which means as many as 2*N extra bytes on 32-bit boxes.” – Mark Bessey Dec 01 '19 at 00:44
  • Thanks for making it clear. As you assumed a 32-bit arch in the sentence in your answer, it'd be nice to explicitly mention that in it. – Alan Evangelista Dec 01 '19 at 22:10
4

Answered now on Wikipedia: timsort will be used in Java 7 who copied it from Android.

Douglas Bagnall
  • 796
  • 7
  • 7
3

Timsort is also in Android now: http://www.kiwidoc.com/java/l/x/android/android/5/p/java.util/c/TimSort

Constantin
  • 27,478
  • 10
  • 60
  • 79
0

The description you linked looks completely general.

dmckee --- ex-moderator kitten
  • 98,632
  • 24
  • 142
  • 234
0

Timsort is not Python-specific. The benefits of using Timsort in Python to sort a list of object references exists in any programming language which has pointers or object references. For instance, Java SE 7+, Android and Swift use Timsort to sort objects.

On the other hand, some variation of quicksort (eg introsort, dual-pivot quicksort) usually sorts primitive types faster, due to cache coherence, and therefore it is usually chosen for this task.

Alan Evangelista
  • 2,888
  • 6
  • 35
  • 45