# [Python-checkins] Hoist the float conversion out of the inner loop. (GH-10430)

Miss Islington (bot) webhook-mailer at python.org
Fri Nov 9 05:39:58 EST 2018

```https://github.com/python/cpython/commit/0a18e0510a145427d8ff1864a011c81ea02cdcd4
commit: 0a18e0510a145427d8ff1864a011c81ea02cdcd4
branch: master
author: Raymond Hettinger <rhettinger at users.noreply.github.com>
committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
date: 2018-11-09T02:39:50-08:00
summary:

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%).

files:
M Lib/random.py

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 @@ def choices(self, population, weights=None, *, cum_weights=None, k=1):
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 @@ def choices(self, population, weights=None, *, cum_weights=None, k=1):
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)]

```