python - किसी सूची में कोई मान मौजूद है या नहीं, यह जांचने का सबसे तेज़ तरीका
performance list (7)
मैं यह जानने का सबसे तेज़ तरीका खोज रहा हूं कि किसी सूची में कोई मान मौजूद है (इसमें लाखों मूल्यों वाली एक सूची) और इसकी अनुक्रमणिका क्या है? मुझे पता है कि सूची में सभी मूल्य मेरे उदाहरण की तरह अद्वितीय हैं।
पहली विधि मैं कोशिश करता हूं (3.8sec मेरे असली कोड में):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
दूसरी विधि मैं कोशिश करता हूं (2x तेज: 1.9sec मेरे असली कोड पर):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Stackoverflow उपयोगकर्ता से प्रस्तावित तरीके (2.74sec मेरे असली कोड पर):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
मेरे वास्तविक कोड में, पहली विधि 3.81sec लेती है और दूसरी विधि 1.88sec लेती है। यह एक अच्छा सुधार है लेकिन:
मैं पाइथन / स्क्रिप्टिंग के साथ एक नौसिखिया हूं और मैं जानना चाहता हूं कि एक ही चीज करने के लिए सबसे तेज़ तरीका मौजूद है और अधिक प्रक्रिया समय बचाता है?
मेरे आवेदन के लिए अधिक विशिष्ट व्याख्या:
ब्लेंडर के एपीआई में कणों की एक सूची तक पहुंच सकते हैं:
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 particles in x:the index
of the particles array"
particles.index([x+1,y,z])
आप अपने सामान को एक set
में डाल सकते हैं। सेट लुकअप बहुत ही कुशल हैं।
प्रयत्न:
s = set(a)
if 7 in s:
# do stuff
एक टिप्पणी में संपादित करें आप कहते हैं कि आप तत्व की अनुक्रमणिका प्राप्त करना चाहते हैं। दुर्भाग्य से, सेट तत्व की स्थिति की कोई धारणा नहीं है। एक विकल्प है अपनी सूची को पूर्व-क्रमबद्ध करना और फिर हर बार आपको तत्व खोजने की आवश्यकता होने पर बाइनरी खोज का उपयोग करना है।
ऐसा लगता है कि आपके एप्लिकेशन को ब्लूम फ़िल्टर डेटा संरचना के उपयोग से लाभ प्राप्त हो सकता है।
संक्षेप में, एक ब्लूम फ़िल्टर लुक-अप आपको बहुत जल्दी बता सकता है यदि कोई मान निश्चित रूप से सेट में मौजूद नहीं है। अन्यथा, आप उस मूल्य की अनुक्रमणिका प्राप्त करने के लिए धीमे रूप से देख सकते हैं जो संभावित रूप से सूची में हो सकता है। इसलिए यदि आपका एप्लिकेशन "नहीं मिला" परिणाम प्राप्त करता है तो अक्सर "पाया" परिणाम मिलता है, तो आप ब्लूम फ़िल्टर जोड़कर एक गति देख सकते हैं।
विवरण के लिए, विकिपीडिया ब्लूम फ़िल्टर कैसे काम करता है, और "पायथन ब्लूम फ़िल्टर लाइब्रेरी" के लिए एक वेब खोज का एक अच्छा अवलोकन प्रदान करता है, कम से कम कुछ उपयोगी कार्यान्वयन प्रदान करेगा।
ध्यान रखें कि ऑपरेटर न केवल समानता ( ==
) का परीक्षण करता है बल्कि पहचान ( is
), list
लिए तर्क में लगभग निम्न के बराबर है (यह वास्तव में सी में लिखा गया है और पाइथन नहीं, कम से कम सीपीथन में):
for element in s: if element is target: # fast check for identity implies equality return True if element == target: # slower check for actual equality return True return False
ज्यादातर परिस्थितियों में यह विवरण अप्रासंगिक है, लेकिन कुछ परिस्थितियों में यह पाइथन नौसिखिया को आश्चर्यचकित कर सकता है, उदाहरण के लिए, numpy.NAN
की असामान्य संपत्ति है जो स्वयं के बराबर नहीं है :
>>> import numpy
>>> numpy.NAN == numpy.NAN
False
>>> numpy.NAN is numpy.NAN
True
>>> numpy.NAN in [numpy.NAN]
True
इन असामान्य मामलों के बीच अंतर करने के लिए आप any()
जैसे उपयोग कर सकते हैं:
>>> lst = [numpy.NAN, 1 , 2]
>>> any(element == numpy.NAN for element in lst)
False
>>> any(element is numpy.NAN for element in lst)
True
any()
साथ list
एस के लिए तर्क in
ध्यान दें:
any(element is target or element == target for element in lst)
हालांकि, मुझे जोर देना चाहिए कि यह एक बढ़िया मामला है, और अधिकांश मामलों in
ऑपरेटर में अत्यधिक अनुकूलित किया गया है और बिल्कुल वही है जो आप निश्चित रूप से चाहते हैं (या तो list
साथ या set
साथ)।
मेरे लिए यह 0.030 (वास्तविक), 0.026s (उपयोगकर्ता) और 0.004s (sys) था।
try:
print("Started")
x = ["a", "b", "c", "d", "e", "f"]
i = 0
while i < len(x):
i += 1
if x[i] == "e":
print("Found")
except IndexError:
pass
7 in a
इसे करने का सबसे तेज़ और तेज़ तरीका।
आप एक set
का उपयोग करने पर भी विचार कर सकते हैं, लेकिन आपकी सूची से उस सेट को बनाने में तेजी से सदस्यता परीक्षण से अधिक समय लग सकता है। निश्चित होने का एकमात्र तरीका अच्छी तरह से बेंचमार्क करना है। (यह भी निर्भर करता है कि आपको किन ऑपरेशन की आवश्यकता है)
a = [1,2,3,4,'a','b','c']
return 'a' in a
मेरा मानना है कि यह जानने का सबसे तेज़ तरीका है कि एक चुना गया मान सरणी में है या नहीं।
present = False
searchItem = 'd'
myList = ['a', 'b', 'c', 'd', 'e']
if searchItem in myList:
present = True
print('present = ', present)
else:
print('present = ', present)