Встроенный диапазон не предназначен для использования таким образом. Он принимает три аргумента: range(start, stop, step)
и изменяется от start
до stop
с постоянным размером шага.
Если вы хотите использовать одну функцию, вы можете использовать logspace numpy
Это выглядит так:
import numpy
li = numpy.logspace(0, 2, base=10, dtype = int)
# li is [1, 10, 100]
# goes from base^0 to base^2, so from 1 to 100
Если вы не хотите полагаться на numpy, решение с циклом while кажется мне очень питонным.
Контрольное время: D
В комментарии указывалось, что это решение может быть:
Первый момент - дело вкуса, но я не согласен с характеристиками:
reps = 100000
list_elems = 100
start = time.perf_counter()
for i in range(reps):
np.logspace(0, list_elems, base=2, dtype=int)
end = time.perf_counter()
numpy_time = end - start
start = time.perf_counter()
for i in range(reps):
[2**x for x in range(list_elems)]
end = time.perf_counter()
python_time = end - start
# reps = 100000
# list_elems = 100
# numpy took 1.70, python took 2.86
# reps = 100000
# list_elems = 10
# numpy took 1.65, python took 0.242
Конечно, это во многом зависит от количества элементов списка, которые вы хотите создать. Numpy вводит накладные расходы, но лучше масштабируется. Так что для более коротких списков Python побеждает.