Pythonで数値のリストの範囲(つまり、最大値-最小値)を見つけるための受け入れられた効率的な方法はありますか?ループを使ってみましたが、min
とmax
関数を減算で使用できることがわかっています。より高速なビルトインがあるのではないかと思っています。
3 に答える
本当に高性能が必要な場合は、Numpyを試してください。この関数は、配列全体numpy.ptp
の値の範囲(つまり)を計算します。max - min
min
andmax
関数よりも速いものを見つけることはまずありません。
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つの可能性は、配列の周囲に独自のクラスを挿入することです(実際の配列を直接操作する場合、これは不可能な場合があります)。これにより、基本的に次の手順が実行されます。
- 最初の空の配列をクリーンとしてマークします。
- 最初の要素を配列に追加する場合は、
themin
とthemax
をその値に設定します。 - 空でない配列に要素を追加する場合は、新しい値をそれらと比較する方法に応じて設定
themin
しthemax
ます。 themin
またはに等しい要素を削除する場合はthemax
、配列をダーティとしてマークします。- クリーンな配列から最小値と最大値を要求する場合は、とを返し
themin
ますthemax
。 - ダーティ配列から最小値と最大値を要求する場合は、上記の擬似コードでループを計算
themin
して使用し、配列をクリーンに設定します。themax
これは、最小値と最大値をキャッシュして、最悪の場合、大きな計算を頻繁に実行する必要がないようにすることです(最小値または最大値のいずれかであった要素を削除した後)。他のすべてのリクエストは、キャッシュされた情報を使用します。
さらに、要素の追加は、大きな計算なしで最新の状態に保たthemin
れます。themax
そして、おそらくさらに良いことに、とのそれぞれにダーティフラグを維持できるので、1つをダーティにすると、他のキャッシュされた値を使用できるようになります。themin
themax
Numpyを使用していて、1-D配列がある場合(またはリストからすばやく作成できる場合)、次の関数がありますnumpy.ptp()
。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ptp.html