From 0a18e0510a145427d8ff1864a011c81ea02cdcd4 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 9 Nov 2018 02:39:50 -0800 Subject: [PATCH] Hoist the float conversion out of the inner loop. (GH-10430) Currently, the *n* and *total* variables get converted to floats each time they are multiplied by random(). This minor tweak does the conversion just once and gets a small speedup (approx 3%). --- Lib/random.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/random.py b/Lib/random.py index b2c0d6fcc3b..4b51b6696bf 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -375,6 +375,7 @@ class Random(_random.Random): if cum_weights is None: if weights is None: _int = int + n += 0.0 # convert to float for a small speed improvement return [population[_int(random() * n)] for i in range(k)] cum_weights = list(_itertools.accumulate(weights)) elif weights is not None: @@ -382,7 +383,7 @@ class Random(_random.Random): if len(cum_weights) != n: raise ValueError('The number of weights does not match the population') bisect = _bisect.bisect - total = cum_weights[-1] + total = cum_weights[-1] + 0.0 # convert to float hi = n - 1 return [population[bisect(cum_weights, random() * total, 0, hi)] for i in range(k)]