From: Raymond Hettinger Date: Fri, 9 Nov 2018 10:39:50 +0000 (-0800) Subject: Hoist the float conversion out of the inner loop. (GH-10430) X-Git-Tag: v3.8.0a1~534 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0a18e0510a145427d8ff1864a011c81ea02cdcd4;p=thirdparty%2FPython%2Fcpython.git 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%). --- diff --git a/Lib/random.py b/Lib/random.py index b2c0d6fcc3b8..4b51b6696bfc 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)]