Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单个迭代中的最小值、最大值和平均值_Python_Max_Average_Min - Fatal编程技术网

Python 单个迭代中的最小值、最大值和平均值

Python 单个迭代中的最小值、最大值和平均值,python,max,average,min,Python,Max,Average,Min,如果我在一个列表中有一个数字或对象的列表,比如l=[3,5,3,6,47,89]。我们可以使用以下python代码计算最小值、最大值和平均值 minimum = min(l) maximum = max(l) avg = sum(l) / len(l) 由于所有这些都涉及迭代整个列表,因此对于大型列表和大量代码来说速度较慢。是否有任何python模块可以同时计算所有这些值?如果安装了pandas,则可以执行以下操作: import numpy as np import pandas s = p

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

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

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

如果安装了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 Voodo)

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)
免责声明:
-cython的速度结果将取决于计算机硬件。
-不像使用内置软件那样灵活和简单。例如,您必须更改函数以处理除整数以外的任何内容。

-在走这条路之前,您应该问问自己,这个操作是否真的是应用程序中的一个大瓶颈。可能不是

@unwind:无序数组怎么能有O(1)来查找最小值和最大值。@Sirish我没有这么说,我说的是遍历一个列表并不太慢,因为每个元素都是在O(1)时间内访问的。你真的尝试过计时,看看它有多慢吗?在C语言中有意义的优化在python中并不总是有意义的。有趣的是,我发现自己迭代一次比让内置函数分别迭代三次更有效。在优化分析中:当遍历项很昂贵时,多次遍历只会真正伤害到你,或者,您可以重用每个条目的部分计算。在这种情况下,您必须对每个项目执行相同的2次比较+(最多)3次赋值,并且它们是独立的,无论您执行单个遍历还是多个遍历。由于查找是O(1),遍历并不昂贵,使用内置(即C原语)的好处远远超过了使用纯python实现的不同算法可能带来的好处。我认为这种比较没有意义,这两段代码是以完全不同的方式编写的。您应该与单次迭代python函数进行比较。@Apollys未使用bultins的单次迭代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