summaryrefslogtreecommitdiffstats
path: root/Lib/test/sortperf.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-05-10 18:20:05 (GMT)
committerGuido van Rossum <guido@python.org>1998-05-10 18:20:05 (GMT)
commitea176b663e79dd8660f7faaeaef0eda45d2ce301 (patch)
treee602a6e414db484b04ed0ba33c08a056af14574e /Lib/test/sortperf.py
parent1e162d3753528ef25885f20106512599ebad9b0b (diff)
downloadcpython-ea176b663e79dd8660f7faaeaef0eda45d2ce301.zip
cpython-ea176b663e79dd8660f7faaeaef0eda45d2ce301.tar.gz
cpython-ea176b663e79dd8660f7faaeaef0eda45d2ce301.tar.bz2
benchmark for list.sort()
Diffstat (limited to 'Lib/test/sortperf.py')
-rw-r--r--Lib/test/sortperf.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
new file mode 100644
index 0000000..5d9232a
--- /dev/null
+++ b/Lib/test/sortperf.py
@@ -0,0 +1,109 @@
+"""Sort performance test."""
+
+import sys
+import time
+import whrandom
+import marshal
+import tempfile
+import operator
+import os
+
+td = tempfile.gettempdir()
+
+def randrange(n):
+ """Return a random shuffle of range(n)."""
+ fn = os.path.join(td, "rr%06d" % n)
+ try:
+ fp = open(fn, "rb")
+ except IOError:
+ result = []
+ for i in range(n):
+ result.append(whrandom.random())
+ try:
+ try:
+ fp = open(fn, "wb")
+ marshal.dump(result, fp)
+ fp.close()
+ fp = None
+ finally:
+ if fp:
+ try:
+ os.unlink(fn)
+ except os.error:
+ pass
+ except IOError, msg:
+ print "can't write", fn, ":", msg
+ else:
+ result = marshal.load(fp)
+ fp.close()
+ ##assert len(result) == n
+ # Shuffle it a bit...
+ for i in range(10):
+ i = whrandom.randint(0, n-1)
+ temp = result[:i]
+ del result[:i]
+ temp.reverse()
+ result[len(result):] = temp
+ del temp
+ return result
+
+def fl():
+ sys.stdout.flush()
+
+def doit(L):
+ t0 = time.clock()
+ L.sort()
+ t1 = time.clock()
+ print "%6.2f" % (t1-t0),
+ fl()
+
+def tabulate(r):
+ fmt = ("%2s %6s" + " %6s"*5)
+ print fmt % ("i", "2**i", "*sort", "\\sort", "/sort", "~sort", "-sort")
+ for i in r:
+ n = 1<<i
+ L = randrange(n)
+ ##assert len(L) == n
+ print "%2d %6d" % (i, n),
+ fl()
+ doit(L) # *sort
+ L.reverse()
+ doit(L) # \sort
+ doit(L) # /sort
+ if n > 4:
+ L = map(operator.neg, map(operator.neg, L[:4]*(n/4)))
+ doit(L) # ~sort
+ L = map(abs, [-0.5]*n)
+ doit(L) # -sort
+ print
+
+def main():
+ import string
+ # default range (inclusive)
+ k1 = 15
+ k2 = 19
+ # one argument: single point
+ # two arguments: specify range
+ if sys.argv[1:]:
+ k1 = string.atoi(sys.argv[1])
+ k2 = k1
+ if sys.argv[2:]:
+ k2 = string.atoi(sys.argv[2])
+ if sys.argv[3:]:
+ # derive random seed from remaining arguments
+ x, y, z = 0, 0, 0
+ for a in sys.argv[3:]:
+ h = hash(a)
+ h, d = divmod(h, 256)
+ h = h & 0xffffff
+ x = (x^h^d) & 255
+ h = h>>8
+ y = (y^h^d) & 255
+ h = h>>8
+ z = (z^h^d) & 255
+ whrandom.seed(x, y, z)
+ r = range(k1, k2+1)
+ tabulate(r)
+
+if __name__ == '__main__':
+ main()