我有:
result
的{{1}}个对象的有序列表。pack
总和为results
。dc
(不是更好的名字)是减少的值。问题:
results
按顺序减少limit
,直到所有result
的总和小于或等于while(self.sum > self.limit):
for dc in self.dc:
if dc.result > 0:
# max() too slow here
result = (
dc.result - self.pack
if dc.result - self.pack > 0
else 0
)
# Prevent sum() count for all list on each iteration
self.sum -= dc.result - result
dc.result = result
if self.sum <= self.limit:
break
(不指定self.pack
值低于0 )。经过一些分析后,我得到了这段代码:
JSON
但它对于小$chart_data = array();
while($row = mysqli_fetch_array($result))
{
$chart_data []['gp_submit']= $row["dt"];
$chart_data[]['cnt] = $row["cnt"];
}
值的性能较低(代码执行的迭代次数过多)。
有没有办法让这种方法更快?
答案 0 :(得分:1)
如果您不太关心从包中删除多少,只要它确保它小于总和,那么您可以将DC实现为最大堆(优先级队列),并且每次都弹出它直到sum为&lt; = self.limit。这将大大加快处理时间,尤其是在大数据集中。
编辑: 由于dc是一个有序列表,只需将其视为堆栈并从后面弹出并从包中取出(因为&#34;最重的&#34;事物在后面)。