ある値がリスト(何百万もの値が入っているリスト)に存在するかどうか、またそのインデックスを知るための最も早い方法は何ですか?
この例のように、リスト内のすべての値が一意であることは知っています。
私が試した最初の方法は(私の実際のコードでは3.8秒):です。
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
2番目に試した方法は(2倍速い:私の実際のコードでは1.9秒):。
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Stack Overflowのユーザーが提案した方法(私の実際のコードでは2.74秒):。
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
私の実際のコードでは、1つ目の方法で3.81秒、2つ目の方法で1.88秒かかっています。 良い改善だとは思いますが。
私はPython/スクリプトの初心者なのですが、同じことをしてもっと処理時間を短縮する方法はありますか?
私のアプリケーションのためのより具体的な説明:。
Blender APIではパーティクルのリストにアクセスできます。
particles = [1, 2, 3, 4, etc.]
そこからパーティクルの位置にアクセスすることができます。
particles[x].location = [x,y,z]
そして、各パーティクルの位置を次のように検索して、隣人が存在するかどうかをテストします。
if [x+1,y,z] in particles.location
"Find the identity of this neighbour particle in x:the particle's index
in the array"
particles.index([x+1,y,z])
7 in a
最も明確で速い方法です。
セット`を使用することもできますが、リストからそのセットを構築するには、メンバーシップテストの高速化で節約できる時間よりも多くの時間がかかる可能性があります。確実な方法は、よくベンチマークを取ることです。(これはどのような操作を必要とするかにもよります)。)
def check_availability(element, collection: iter):
return element in collection
**使用例***。
check_availability('a', [1,2,3,4,'a','b','c'])
選択した値が配列にあるかどうかを知るには、これが一番早い方法だと思います。