I'm trying to solve an algorithm problem,consider the following list:
l = [100, 20, 50, 70, 45]
in this problem I have to find the average of the elements up to index i:
i = 0
100
i = 1
(100 + 20) //2 = 60
i = 2
(100+20+50) // 3 = 56
...
the final result should be stored in a list:
[100, 60, 56, 60, 57]
this is my code so far:
from functools import reduce
def meanScores(l):
def av(x):
return reduce(lambda a, b: a+b,x)//len(x)
return [av(l[:i]) for i in range(1,len(l)+1)]
It works fine the problem is that when I submitted it, I faced a time limit execution.I think the problem is the for loop since it takes a lot of time when len(l) is more than ten-thousand. Previously I used sum() to do the averaging but that took a lot of time too, when I turned that sum() to reduce(lambda a, b: a+b,x)//len(x) the algorithm got faster(It solved more test cases).I think that if instead of an for loop I use another function(like lambda) then the problem is solved.So do you think there is a way? thank you for your time.
解决方案
You can try to use numpy.cumsum and get the average dividing by the index+1 of the cumsum list.
import numpy as np
l = [100, 20, 50, 70, 45]
l_cumsum = np.cumsum(l)
l_indices = np.arange(1,len(l)+1,1)
l_average = np.divide(l_cumsum, l_indices).tolist()
print(l_average) # Outputs [100.0, 60.0, 56.666666666666664, 60.0, 57.0]
It should be pretty fast, O(n), since numpy.cumsum is very optimized already. If you still want it faster you could multithread it.