Mercurial > cpython-lru_cache-weakref
annotate Lib/test/sortperf.py @ 58925:eecf1bef052d 2.6
Merged revisions 78207 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line
#7930: fix stripid
........
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Tue, 16 Feb 2010 23:29:44 +0000 |
| parents | 45b4fc63bf67 |
| children | 6b18a095c2e7 |
| rev | line source |
|---|---|
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
1 """Sort performance test. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
2 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
3 See main() for command line syntax. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
4 See tabulate() for output format. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
5 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
6 """ |
| 8288 | 7 |
| 8 import sys | |
| 9 import time | |
|
22933
32a9b19dba1d
Use random instead of whrandom
Andrew M. Kuchling <amk@amk.ca>
parents:
16517
diff
changeset
|
10 import random |
| 8288 | 11 import marshal |
| 12 import tempfile | |
| 13 import os | |
| 14 | |
| 15 td = tempfile.gettempdir() | |
| 16 | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
17 def randfloats(n): |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
18 """Return a list of n random floats in [0, 1).""" |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
19 # Generating floats is expensive, so this writes them out to a file in |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
20 # a temp directory. If the file already exists, it just reads them |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
21 # back in and shuffles them a bit. |
| 8288 | 22 fn = os.path.join(td, "rr%06d" % n) |
| 23 try: | |
| 24 fp = open(fn, "rb") | |
| 25 except IOError: | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
26 r = random.random |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
27 result = [r() for i in xrange(n)] |
| 8288 | 28 try: |
| 29 try: | |
| 30 fp = open(fn, "wb") | |
| 31 marshal.dump(result, fp) | |
| 32 fp.close() | |
| 33 fp = None | |
| 34 finally: | |
| 35 if fp: | |
| 36 try: | |
| 37 os.unlink(fn) | |
| 38 except os.error: | |
| 39 pass | |
| 40 except IOError, msg: | |
| 41 print "can't write", fn, ":", msg | |
| 42 else: | |
| 43 result = marshal.load(fp) | |
| 44 fp.close() | |
| 45 # Shuffle it a bit... | |
| 46 for i in range(10): | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
47 i = random.randrange(n) |
| 8288 | 48 temp = result[:i] |
| 49 del result[:i] | |
| 50 temp.reverse() | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
51 result.extend(temp) |
| 8288 | 52 del temp |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
53 assert len(result) == n |
| 8288 | 54 return result |
| 55 | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
56 def flush(): |
| 8288 | 57 sys.stdout.flush() |
| 58 | |
| 59 def doit(L): | |
| 60 t0 = time.clock() | |
| 61 L.sort() | |
| 62 t1 = time.clock() | |
| 63 print "%6.2f" % (t1-t0), | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
64 flush() |
| 8288 | 65 |
| 66 def tabulate(r): | |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
67 """Tabulate sort speed for lists of various sizes. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
68 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
69 The sizes are 2**i for i in r (the argument, a list). |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
70 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
71 The output displays i, 2**i, and the time to sort arrays of 2**i |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
72 floating point numbers with the following properties: |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
73 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
74 *sort: random data |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
75 \sort: descending data |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
76 /sort: ascending data |
|
24346
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
77 3sort: ascending, then 3 random exchanges |
|
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
78 +sort: ascending, then 10 random at the end |
|
24472
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
79 %sort: ascending, then randomly replace 1% of the elements w/ random values |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
80 ~sort: many duplicates |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
81 =sort: all equal |
|
8427
e96e3d387611
Add Tim's worst case scenario.
Guido van Rossum <guido@python.org>
parents:
8394
diff
changeset
|
82 !sort: worst case scenario |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
83 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
84 """ |
|
24472
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
85 cases = tuple([ch + "sort" for ch in r"*\/3+%~=!"]) |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
86 fmt = ("%2s %7s" + " %6s"*len(cases)) |
|
8427
e96e3d387611
Add Tim's worst case scenario.
Guido van Rossum <guido@python.org>
parents:
8394
diff
changeset
|
87 print fmt % (("i", "2**i") + cases) |
| 8288 | 88 for i in r: |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
89 n = 1 << i |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
90 L = randfloats(n) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
91 print "%2d %7d" % (i, n), |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
92 flush() |
| 8288 | 93 doit(L) # *sort |
| 94 L.reverse() | |
| 95 doit(L) # \sort | |
| 96 doit(L) # /sort | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
97 |
|
24341
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
98 # Do 3 random exchanges. |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
99 for dummy in range(3): |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
100 i1 = random.randrange(n) |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
101 i2 = random.randrange(n) |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
102 L[i1], L[i2] = L[i2], L[i1] |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
103 doit(L) # 3sort |
|
3ef019caad1e
Added new test "3sort". This is sorted data but with 3 random exchanges.
Tim Peters <tim.peters@gmail.com>
parents:
24292
diff
changeset
|
104 |
|
24346
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
105 # Replace the last 10 with random floats. |
|
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
106 if n >= 10: |
|
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
107 L[-10:] = [random.random() for dummy in range(10)] |
|
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
108 doit(L) # +sort |
|
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
109 |
|
24472
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
110 # Replace 1% of the elements at random. |
|
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
111 for dummy in xrange(n // 100): |
|
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
112 L[random.randrange(n)] = random.random() |
|
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
113 doit(L) # %sort |
|
45b4fc63bf67
New test %sort. This takes a sorted list, picks 1% of the list positions
Tim Peters <tim.peters@gmail.com>
parents:
24346
diff
changeset
|
114 |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
115 # Arrange for lots of duplicates. |
| 8288 | 116 if n > 4: |
|
8311
f4fc9d18a53d
Reduce memory requirements.
Guido van Rossum <guido@python.org>
parents:
8289
diff
changeset
|
117 del L[4:] |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
118 L = L * (n // 4) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
119 # Force the elements to be distinct objects, else timings can be |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
120 # artificially low. |
|
8311
f4fc9d18a53d
Reduce memory requirements.
Guido van Rossum <guido@python.org>
parents:
8289
diff
changeset
|
121 L = map(lambda x: --x, L) |
| 8288 | 122 doit(L) # ~sort |
|
8311
f4fc9d18a53d
Reduce memory requirements.
Guido van Rossum <guido@python.org>
parents:
8289
diff
changeset
|
123 del L |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
124 |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
125 # All equal. Again, force the elements to be distinct objects. |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
126 L = map(abs, [-0.5] * n) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
127 doit(L) # =sort |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
128 del L |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
129 |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
130 # This one looks like [3, 2, 1, 0, 0, 1, 2, 3]. It was a bad case |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
131 # for an older implementation of quicksort, which used the median |
|
24346
2dc23f0f3421
New test "+sort", tacking 10 random floats on to the end of a sorted
Tim Peters <tim.peters@gmail.com>
parents:
24341
diff
changeset
|
132 # of the first, last and middle elements as the pivot. |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
133 half = n // 2 |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
134 L = range(half - 1, -1, -1) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
135 L.extend(range(half)) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
136 # Force to float, so that the timings are comparable. This is |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
137 # significantly faster if we leave tham as ints. |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
138 L = map(float, L) |
|
8427
e96e3d387611
Add Tim's worst case scenario.
Guido van Rossum <guido@python.org>
parents:
8394
diff
changeset
|
139 doit(L) # !sort |
| 8288 | 140 print |
| 141 | |
| 142 def main(): | |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
143 """Main program when invoked as a script. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
144 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
145 One argument: tabulate a single row. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
146 Two arguments: tabulate a range (inclusive). |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
147 Extra arguments are used to seed the random generator. |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
148 |
|
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
149 """ |
| 8288 | 150 # default range (inclusive) |
| 151 k1 = 15 | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
152 k2 = 20 |
| 8288 | 153 if sys.argv[1:]: |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
154 # one argument: single point |
|
16517
eee67a84e5fa
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
8427
diff
changeset
|
155 k1 = k2 = int(sys.argv[1]) |
| 8288 | 156 if sys.argv[2:]: |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
157 # two arguments: specify range |
|
16517
eee67a84e5fa
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
8427
diff
changeset
|
158 k2 = int(sys.argv[2]) |
| 8288 | 159 if sys.argv[3:]: |
| 160 # derive random seed from remaining arguments | |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
161 x = 1 |
| 8288 | 162 for a in sys.argv[3:]: |
|
24292
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
163 x = 69069 * x + hash(a) |
|
2d407484a4e6
Gave this a facelift: "/" vs "//", whrandom vs random, etc. Boosted
Tim Peters <tim.peters@gmail.com>
parents:
22933
diff
changeset
|
164 random.seed(x) |
|
8289
9281b5d35641
Add a few doc strings.
Guido van Rossum <guido@python.org>
parents:
8288
diff
changeset
|
165 r = range(k1, k2+1) # include the end point |
| 8288 | 166 tabulate(r) |
| 167 | |
| 168 if __name__ == '__main__': | |
| 169 main() |
