我猜聚合是 Django 执行此操作的方式,但建议的示例会产生如 Behesti 所说的大量查询。我的猜测是,django ORM 真的不是为数字运算而构建的(但我在这里可能错了!)
我可能会选择 numpy (如果你真的有巨大的数组,我想你需要做一些分区):
使用 numpy 的好处是它通常比“标准”python 操作快得多,但坏处是它的额外依赖性。
import numpy
raw_array = [ # This is for testing the code, use .values_list( 'val1', 'val2' ) with db
[1 , 5 , 6],
[2 , 6 , 4],
[3 , 3 , 1],
[4 , 8 , 4],
[5 , 2 , 6],
[6 , 8 , 2],
[7 , 1 , 1],
]
arr = numpy.array( raw_array )
def sum_up_every_n_items( arr, n ):
res = numpy.zeros( (numpy.floor( arr.shape[0]/float(n) ), arr.shape[1]) )
arr = arr[ 0:res.shape[0]*n, : ] # Truncate, take only full N items
for loop in range(0,n): # Note: this is loop 0,1,2 if n=3 ! We do addition with numpy vectors!
res = res + arr[ loop::n, : ] # Get every n'th row from starting with offset
res = res / float(n)
return res
res = sum_up_every_n_items( arr, n=3 )
print res
输出
[[ 2. 4.66666667 3.66666667]
[ 5. 6. 4. ]]