我正在尝试解决算法问题,请考虑以下列表:
I'm trying to solve an algorithm problem,consider the following list:
l = [100, 20, 50, 70, 45]在此问题中,我必须找到直到索引i的元素的平均值:
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)]效果很好,问题是我提交时遇到了时间限制。我认为问题是for循环,因为当 len(l)大于十分之一时会花费很多时间一千。以前,我使用 sum()进行平均,但是当我打开 sum()到 reduce(lambda a,b:a + b,x)// len(x)算法变得更快(它解决了更多的测试案例)。如果我不是使用for循环,而是使用另一个函数(例如lambda),那么问题就解决了。那么您认为有办法吗?谢谢您的时间。
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.
推荐答案您可以尝试使用 numpy.cumsum 并获取平均值
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]应该很快,O(n),因为 numpy.cumsum 已经非常优化。如果仍然希望更快,则可以对其进行多线程处理。
It should be pretty fast, O(n), since numpy.cumsum is very optimized already. If you still want it faster you could multithread it.
更多推荐
如何通过替换python中的循环来减少算法中的执行时间
发布评论