Ускорить код. Python
Коллеги, как можно ускорить данный код? Логика работы: Функция должна видоизменять массив таким образом, чтобы каждый индекс имел одинаковое количество значений. Вход [0,10]> Выход [5,5]
В данном исполнении получаю Execution Timed Out (12000 ms)
Необходимо вернуть не новый лист, а изменить имеющийся.
def redistribute_wealth(wealth):
result = [sum(wealth)/len(wealth) for x in wealth]
wealth.clear()
for i in range(len(result)):
wealth.append(result[i])
return wealth
Ответы (5 шт):
Ваш код легко сокращается до такого:
def redistribute_wealth(wealth):
return [sum(wealth)/len(wealth)] * len(wealth)
Если и этого будет по скорости не хватать, то можно перейти на массивы библиотеки Numpy. Единственное, что мне непонятно - зачем вам массив одинаковых значений на выходе? Это же заведомо будут одинаковые числа, зачем их плодить и тратить память? Вы можете как-то воспользоваться этим знанием, что они одинаковые.
Если нужно именно изменить, то нужно менять по месту:
def redistribute_wealth(wealth):
average = sum(wealth)/len(wealth)
for i in range(len(wealth)):
wealth[i] = average
return wealth
ну если такое условие, то можно так испитониться:
from statistics import mean
def redistribute_wealth(wealth):
wealth[::] = [mean(wealth)]*len(wealth)
return
w = [0,10]
redistribute_wealth(w)
print(w) # [5, 5]
Заменить значения по месту без выделения дополнительной памяти и циклов:
def redistribute_wealth(wealth):
average = sum(wealth) / len(wealth)
wealth[:] = (average for _ in range(len(wealth)))
wealth = list(range(10))
print(id(wealth), wealth)
redistribute_wealth(wealth)
print(id(wealth), wealth)
$ python redistribute_wealth.py 140063750132736 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 140063750132736 [4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5]
Условие написано крайне некомфортно. Иногда сижу и думаю: автор, люди не такие умные и не умеют читать мысли. В таких мелких утилитах не надо "экономить место на экране". Больше людей привлечёт интерес к задаче. Не знаю, насколько мой вариант "быстро", но вот мой готовый скрипт:
import os
def redistribute_wealth(wealth):
avg_wealth = sum(wealth) / len(wealth)
wealth[:] = [avg_wealth] * len(wealth)
return wealth
print(redistribute_wealth([0, 10]))
print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")