Vilket är det snabbaste sättet att få reda på om ett värde finns i en lista (en lista med miljontals värden) och vilket index det har?
Jag vet att alla värden i listan är unika som i det här exemplet.
Den första metoden jag försöker är (3,8 sekunder i min riktiga kod):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Den andra metoden jag försöker är (2x snabbare: 1.9 sek. i min riktiga kod):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Föreslagna metoder från en Stack Overflow-användare (2.74 sek för min riktiga kod):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
I min riktiga kod tar den första metoden 3,81 sekunder och den andra metoden 1,88 sekunder. Det är en bra förbättring, men:
Jag är nybörjare på Python/scripting och finns det ett snabbare sätt att göra samma saker och spara mer bearbetningstid?
En mer specifik förklaring för min tillämpning:
I Blender API kan jag få tillgång till en lista med partiklar:
particles = [1, 2, 3, 4, etc.]
Därifrån kan jag få tillgång till en partikel's plats:
particles[x].location = [x,y,z]
För varje partikel testar jag om det finns en granne genom att söka på varje partikelplats på följande sätt:
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
Det är det tydligaste och snabbaste sättet att göra det.
Du kan också överväga att använda en set
, men att konstruera denna uppsättning från din lista kan ta mer tid än vad snabbare medlemskapstestning sparar. Det enda sättet att vara säker är att göra bra benchmarking. (Detta beror också på vilka operationer du behöver).
Du kan placera dina objekt i en set
. Uppsättningar är mycket effektiva.
Prova:
s = set(a)
if 7 in s:
# do stuff
redigera I en kommentar säger du att du vill få fram elementets index. Tyvärr har uppsättningar ingen uppfattning om elementets position. Ett alternativ är att sortera din lista i förväg och sedan använda binär sökning varje gång du behöver hitta ett element.
def check_availability(element, collection: iter):
return element in collection
Användning
check_availability('a', [1,2,3,4,'a','b','c'])
Jag tror att detta är det snabbaste sättet att veta om ett valt värde finns i en array.