在Python中高效地查找数组的范围?

4

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

3个回答

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

我无论如何都在使用numpy。这正是我正在寻找的!你比其他人先回答了1分钟,所以你得到了勾选标记 ;) - dinkelk
3
我仍然想要一个能够返回最小值和最大值的元组的 numpy 函数/方法 :o( - heltonbiker

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)

另一种可能性是在数组周围插入自己的类(如果想要直接使用真实数组,则可能不可行)。这基本上会执行以下步骤:
  • 标记初始空数组为干净。
  • 如果将第一个元素添加到数组中,则将theminthemax设置为该值。
  • 如果向非空数组添加元素,则根据新值与它们的比较方式设置theminthemax
  • 如果删除等于theminthemax的元素,则标记数组为脏。
  • 如果从干净的数组请求最小值和最大值,则返回theminthemax
  • 如果从脏数组请求最小值和最大值,则使用上述伪代码中的循环计算theminthemax,然后将数组设置为干净。

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

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

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


1
仅仅是对语义的小挑剔...我会称minmax为内置函数,而不是方法... - mgilson
你可以将其更改为 elif value > themax:,因为在有序字段中,一个值不可能既大于另一个值又小于它。在随机分布的列表上,这应该会显著减少比较次数。 - Joel Cornett
mgilson:谢谢,已经修复了。Joel,你说得好,我也把它修复了。 - paxdiablo

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接