4

Pythonで数値のリストの範囲(つまり、最大値-最小値)を見つけるための受け入れられた効率的な方法はありますか?ループを使ってみましたが、minmax関数を減算で使用できることがわかっています。より高速なビルトインがあるのではないかと思っています。

4

3 に答える 3

12

本当に高性能が必要な場合は、Numpyを試してください。この関数は、配列全体numpy.ptpの値の範囲(つまり)を計算します。max - min

于 2012-10-25T01:55:08.017 に答える
4

minandmax関数よりも速いものを見つけることはまずありません。

2つのパスではなく、1つのパスを実行して2つの値を計算する関数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)

もう1つの可能性は、配列の周囲に独自のクラスを挿入することです(実際の配列を直接操作する場合、これは不可能な場合があります)。これにより、基本的に次の手順が実行されます。

  • 最初の空の配列をクリーンとしてマークします。
  • 最初の要素を配列に追加する場合は、theminthemaxをその値に設定します。
  • 空でない配列に要素を追加する場合は、新しい値をそれらと比較する方法に応じて設定theminthemaxます。
  • theminまたはに等しい要素を削除する場合はthemax、配列をダーティとしてマークします。
  • クリーンな配列から最小値と最大値を要求する場合は、とを返しtheminますthemax
  • ダーティ配列から最小値と最大値を要求する場合は、上記の擬似コードでループを計算theminして使用し、配列をクリーンに設定します。themax

これは、最小値と最大値をキャッシュして、最悪の場合、大きな計算を頻繁に実行する必要がないようにすることです(最小値または最大値のいずれかであった要素を削除した後)。他のすべてのリクエストは、キャッシュされた情報を使用します。

さらに、要素の追加は、大きな計算なしで最新の状態に保たtheminれます。themax

そして、おそらくさらに良いことに、とのそれぞれにダーティフラグを維持できるので、1つをダーティにすると、他のキャッシュされた値を使用できるようになります。theminthemax

于 2012-10-25T01:49:21.597 に答える
4

Numpyを使用していて、1-D配列がある場合(またはリストからすばやく作成できる場合)、次の関数がありますnumpy.ptp()

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

于 2012-10-25T01:55:32.537 に答える