~/py27 $ hg diff diff --git a/Lib/random.py b/Lib/random.py --- a/Lib/random.py +++ b/Lib/random.py @@ -290,6 +290,24 @@ j = _int(random() * (i+1)) x[i], x[j] = x[j], x[i] + def shuffle_min(self, x, random=None): + if random is None: + random = self.random + _int = int + _min = min + for i in reversed(xrange(1, len(x))): + j = _min(_int(random() * (i+1)), i) + x[i], x[j] = x[j], x[i] + + def shuffle_eq(self, x, random=None): + if random is None: + random = self.random + _int = int + for i in reversed(xrange(1, len(x))): + j = _int(random() * (i+1)) + if j != i+1: + x[i], x[j] = x[j], x[i] + def sample(self, population, k): """Chooses k unique random elements from a population sequence. ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 2.69 msec per loop ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_min' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 3.76 msec per loop ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_eq' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 3.01 msec per loop ~/py27 $ ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 2.69 msec per loop ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_min' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 3.82 msec per loop ~/py27 $ py27 -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_eq' -s 'seq = range(10000)' 'shuffle(seq)' 100 loops, best of 3: 3.01 msec per loop ~/py27 $ ~/py27 $ cp Lib/random.py random.py ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 155 usec per loop ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_min' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 152 usec per loop ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_eq' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 160 usec per loop ~/py27 $ ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 155 usec per loop ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_min' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 152 usec per loop ~/py27 $ pypy -m timeit -s 'import random' -s 'shuffle=random.Random(8675309).shuffle_eq' -s 'seq = range(10000)' 'shuffle(seq)' 10000 loops, best of 3: 160 usec per loop