在python中有效地找到数组的范围?

din*_*elk 5 python performance range max min

有没有一种可接受的有效方法来查找python中数字列表的范围(即最大值 - 最小值)?我尝试过使用循环,我知道我可以使用带减法的minmax函数.我只是想知道是否有某种更快的内置.

nne*_*neo 11

如果你真的需要高性能,试试Numpy.该函数numpy.ptp计算max - min数组中值的范围(即).

  • 我仍然想念一个numpy函数/方法,它返回一个包含最小值和最大值的元组:o( (2认同)

pax*_*blo 5

您不可能找到比minmax函数更快的东西了。

您可以编写一个minmax函数,该函数执行一次传递来计算两个值,而不是两次传递,但您应该对此进行基准测试以确保它更快。如果它是用 Python 本身编写的,则可能不会,但添加到 Python 中的 C 例程可能会做到这一点。像这样的东西(伪代码,尽管它看起来像Python):

def minmax (arr):
    if arr is empty:
        return (None, None)
    themin = arr[0]
    themax = arr[0]
    for each value in arr[1:]:
        if value < themin:
            themin = value
        else:
            if value > themax:
                themax = value
    return (themin, themax)
Run Code Online (Sandbox Code Playgroud)

另一种可能性是在数组周围插入您自己的类(如果您想直接处理真实数组,这可能是不可能的)。这基本上会执行以下步骤:

  • 将初始空数组标记为干净。
  • 如果将第一个元素添加到数组中,请将themin和设置themax为该值。
  • 如果将元素添加到非空数组,请设置themin和 ,themax具体取决于新值与它们的比较方式。
  • 如果删除等于themin或 的元素themax,则将数组标记为脏。
  • 如果从干净数组中请求最小值和最大值,则返回theminthemax
  • 如果从脏数组中请求最小值和最大值,请计算theminthemax使用上面伪代码中的循环,然后将数组设置为干净的。

这样做的作用是缓存最小值和最大值,这样,在最坏的情况下,您只需要很少进行大型计算(在删除最小值或最大值的元素之后)。所有其他请求都使用缓存的信息。

此外,元素的添加无需进行大量计算即可保持最新theminthemax

而且,可能更好的是,您可以为每个和维护一个脏标志,这样脏一个仍然允许theminthemax使用另一个的缓存值。