单次迭代中的最小值,最大值和平均值

时间:2014-03-04 14:57:59

标签: python max average min

如果我有列表中的数字或对象,如l = [3,5,3,6,47,89]。我们可以使用以下python代码计算最小值,最大值和平均值

minimum = min(l)
maximum = max(l)
avg = sum(l) / len(l)

由于所有涉及迭代整个列表,对于大型列表和大量代码来说速度很慢。是否有任何python模块可以一起计算所有这些值?

2 个答案:

答案 0 :(得分:3)

如果你安装了pandas,你可以这样做:

import numpy as np
import pandas
s = pandas.Series(np.random.normal(size=37))
stats = s.describe()

stats将是另一个行为类似字典的系列:

print(stats)
count    37.000000
mean      0.072138
std       0.932000
min      -1.267888
25%      -0.688728
50%      -0.048624
75%       0.784244
max       2.501713
dtype: float64

stats['max']
2.501713

...等。但是,除非您只是为了简洁的代码而努力,否则我不建议这样做。原因如下:

%%timeit
stats = s.describe()
# 100 loops, best of 3: 1.44 ms per loop

%%timeit
mymin = min(s)
mymax = max(s)
myavg = sum(s)/len(s)
# 10000 loops, best of 3: 89.5 µs per loop

我无法想象你能用你自己的实现从内置函数中挤出更多的性能(除非有一些cython voodoo,也许)。

答案 1 :(得分:3)

Cython功能:

@cython.boundscheck(False)
@cython.wraparound(False)
def minmaxAvg(list x):

    cdef int i
    cdef int _min, _max, total
    _min = x[0]
    _max = x[0]
    total = 0
    for i in x:
        if i < _min: _min = i 
        elif i > _max: _max = i 
        total += i
    return _min, _max, total/len(x)

要与之比较的纯python函数:

def builtinfuncs(x):
    a = min(x)
    b = max(x)
    avg = sum(x) / len(x)
    return a,b,avg


In [16]: x = [random.randint(0,1000) for _ in range(10000)]

In [17]: %timeit minmaxAvg(x)
10000 loops, best of 3: 34 µs per loop

In [18]: %timeit frob(x)
1000 loops, best of 3: 460 µs per loop

声明:
- cython的速度结果将取决于计算机硬件 - 不像使用内置设备那样灵活和万无一失。例如,您必须更改函数以处理除整数之外的任何内容 - 在走这条路之前,你应该问问自己这个操作是否真的是你的应用程序的一大瓶颈。可能不是。