Ответ 1
Это просто детали реализации. randint
делегирует randrange
, поэтому он имеет другой слой служебных вызовов функции, а randrange
проходит множество проверок аргументов и другой crud. Напротив, choice
- действительно простой однострочный.
Здесь для этого вызова проходит путь кода randint
с комментариями и неиспользованным кодом:
def randint(self, a, b):
return self.randrange(a, b+1)
def randrange(self, start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF):
istart = _int(start)
if istart != start:
# not executed
if stop is None:
# not executed
istop = _int(stop)
if istop != stop:
# not executed
width = istop - istart
if step == 1 and width > 0:
if width >= _maxwidth:
# not executed
return _int(istart + _int(self.random()*width))
И здесь проходит путь кода choice
:
def choice(self, seq):
return seq[int(self.random() * len(seq))]