建立更早的问题:在单程中计算生成器的统计数据。Python
正如我之前提到的,一次通过生成器计算统计数据非常快速且内存高效。复杂的统计和排名属性,如第 90 个百分位和第 n 个最小的,通常需要比标准差和平均值更复杂的工作(在上面解决了)。在处理 map/reduce 作业和大型数据集时,这些方法变得非常重要,因为将数据放入列表或计算多次传递变得非常缓慢。
下面是一个 O(n) 快速排序风格的算法,用于根据排名顺序查找数据。用于查找中位数、百分位数、四分位数和十分位数。当数据已经排序时,等价于 data[n]。但需要列表中可以拆分/透视的所有数据。
如何使用生成器一次性计算中位数、百分位数、四分位数和十分位数?
需要完整列表的快速排序风格算法
import random
def select(data, n):
"Find the nth rank ordered element (the least value has rank 0)."
data = list(data)
if not 0 <= n < len(data):
raise ValueError('not enough elements for the given rank')
while True:
pivot = random.choice(data)
pcount = 0
under, over = [], []
uappend, oappend = under.append, over.append
for elem in data:
if elem < pivot:
uappend(elem)
elif elem > pivot:
oappend(elem)
else:
pcount += 1
if n < len(under):
data = under
elif n < len(under) + pcount:
return pivot
else:
data = over
n -= len(under) + pcount