簡體   English   中英

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

[英]Minimum, Maximum and Average in a single iteration

如果我有一個數字或對象列表,例如l = [3,5,3,6,47,89]。 我們可以使用以下python代碼計算最小值,最大值和平均值

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

由於所有步驟都涉及遍歷整個列表,因此對於大型列表和大量代碼來說速度很慢。是否有任何python模塊可以一起計算所有這些值?

如果安裝了熊貓,則可以執行以下操作:

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除外)。

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的速度結果將取決於計算機硬件。
-不像使用內置函數那樣靈活,簡單。 例如,您將不得不更改函數以處理除整數以外的任何內容。
-在走這條路之前,您應該問自己這個操作是否確實是應用程序中的大瓶頸。 可能不是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM