4

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

4

3 回答 3

12

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

于 2012-10-25T01:55:08.017 回答
4

你不可能找到比minandmax函数更快的东西。

您可以编写一个函数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)

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

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

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

此外,元素的添加无需大量计算即可保持themin和更新。themax

而且,可能更好的是,您可以为每个theminand维护一个脏标志,themax以便弄脏一个仍然允许您使用另一个的缓存值。

于 2012-10-25T01:49:21.597 回答
4

如果你使用 Numpy 并且你有一个一维数组(或者可以从列表中快速创建一个),那么就有了函数numpy.ptp()

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ptp.html

于 2012-10-25T01:55:32.537 回答