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

时间:2012-10-25 01:45:19

标签: python performance range max min

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

您不可能找到比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)

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

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

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

此外,添加元素可使theminthemax保持最新状态,而无需大量计算。

而且,甚至可能更好,你可以为 theminthemax的每个维护一个脏标志,这样弄脏的标志仍然允许你使用缓存的值其他人。

答案 2 :(得分:3)

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

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