あなたはitertoolsを使用して列挙/ジェネレータのアプローチよりも良い時間を頂く場合がございます。私はitertoolsが私たち全員のパフォーマンスの邪魔者のために基礎となるアルゴリズムのより速い実装を提供すると思います。しかし、bisectはまだより速いかもしれません。
from itertools import islice, dropwhile
threshold = 5
seq = [1,4,6,9,11]
first_val = islice(dropwhile(lambda x: x<=threshold, seq),0,1)
result = seq.index(first_val)
私はここに示す二分アプローチと限りイディオム/速度など、ドキュメントの例では、あなたの質問のためにリストされているものの違いについて疑問に思います。彼らは値を見つける方法を示していますが、最初の行に切り捨ててインデックスを返します。私はそれが "bisect_right"の代わりに "bisect_right"と呼ばれているので、おそらく一方向からしか見えないと思います。あなたのリストがソートされ、あなたがより大きい値を求めていることを考えると、これは最大の検索経済かもしれません。
from bisect import bisect_right
def find_gt(a, x):
'Find leftmost value(switching this to index) greater than x'
return bisect_right(a, x)
興味深い質問。
2つ目の方法は、列挙がなくても単純なループを使用してlist.index()を戻す方が高速です。しかし、バイセクト・ソリューションにはどこもありません。 – rplnt
@rplnt - ありがとう、私はそれを比較に追加しました。あなたが正しいです、それは列挙より速いです。 – eumiro