2015-07-15 11 views
7

Ich mache eine AJAX Aufruf und Weitergabe Variable pub drin, die 1 oder 0 sein könnte.Python in vs ==. Was soll in diesem Fall verwendet werden?

Als Anfänger möchte ich doppelt sicher sein, dass der variable Typ kommt. Ich bin mir bewusst, dass ich problemlos zu int() konvertieren kann und das Problem ist eigentlich nicht mit AJAX Ergebnis, aber es führte zu dieser Frage.

Mein Code:

if pub == 1 or pub == '1': 
    #execute funcA() 

Aber das ist oben nicht so pythonic für mich so habe ich versucht:

if pub in [1,'1']: 
    #execute funcA() 

Welche der oben genannten Code besser in Bezug auf ist:

  1. Leistung (Geschwindigkeit).
  2. Best Practice.
  3. Speicherauslastung.
+2

eingeben Wie Sie machen ein Ajax-Aufruf, so dass es serialisiert wird, was bedeutet, dass es immer "1" ist. –

+2

Warum haben Sie sowohl 2.7 als auch 3.x getaggt? – thefourtheye

+0

basierend auf http://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values ​​Ich würde Pub in {1,1} oder Pub in (1, -1) –

Antwort

12

Leistung reduziert: in besser

timeit.timeit("pub='1'; pub == 1 or pub == '1'") 
0.07568907737731934 
timeit.timeit("pub='1'; pub in[1, '1']") 
0.04272890090942383 
timeit.timeit("pub=1; pub == 1 or pub == '1'") 
0.07502007484436035 
timeit.timeit("pub=1; pub in[1, '1']") 
0.07035684585571289 

#other options 
timeit.timeit("pub='1'; pub in (1,'1')") 
0.04643988609313965 
timeit.timeit("pub='1'; pub in {1,'1'}") 
0.17076611518859863 
timeit.timeit("pub=1; pub in (1,'1')") 
0.047419071197509766 
timeit.timeit("pub=1; pub in {1,'1'}") 
0.1770930290222168 

Also, {} > or > [] >() basierend auf der Leistung.

Praxis: in ist bevorzugt, da es weniger zu tippen ist.(), [], {} gleich gut basierend auf der Praxis

Speicher:

sys.getsizeof([1,"1"]) 
88 
sys.getsizeof("1",1) 
38 

#other options 
sys.getsizeof(("1",1)) 
72 
sys.getsizeof({"1",1}) 
232 

So {} > [] >() > or basierend auf Speicher

Obwohl nicht gefragt ,, gut zu wissen:

Funktionalität: Wertgleichheit und keine Referenzgleichheit

in ist nur sequentielle Überprüfung Gleichheit ==. So ähnlich. in verwendet == und nicht is. Was ich damit sagen will, ist dies:

>>> a = [1,2,3] 
>>> b = [1,a] 
>>> b 
[1, [1, 2, 3]] 
>>> 1 in b 
True 
>>> a in b 
True 
>>> [1,2,3] in b 
True 

So ist es nicht wie folgt umgesetzt:

>>> for i in b: 
...  print [1,2,3] is i 
... 
False 
False 

is wird Wahr zurück, wenn zwei Variablen auf das gleiche Objekt zeigen, == wenn die Objekte auf die sich die Variablen beziehen, sind gleich. in verwendet ==

+2

* "**' in' verwendet '==' ** "* - nur wenn' ist 'stimmt nicht überein. Beachten Sie auch, dass Ihre Zeitangabe die Kosten für die Erstellung des Objekts enthält (z. B. Literal setzen), was nicht unbedingt repräsentativ ist. – jonrsharpe

7

Dieser Code ist besser

if pub in [1,'1']: 
    #execute funcA() 

, weil es etwas schneller ist, aber vor allem, weil es nicht redundant ist. Die Variable pub erscheint nur einmal dort.

+0

Dies ist Auch schön, weil Sie damit in Zukunft einfach mehr Werte hinzufügen und gleichzeitig lesbar bleiben. 'if pub in [1, '1', 'eins', 'uno']:' – dmertl

3

So Leistung klug in ist besser:

timeit.timeit("pub='1'; pub == 1 or pub == '1'") 
0.16224503758795805 
timeit.timeit("pub='1'; pub in[1, '1']") 
0.13723585976354258 
timeit.timeit("pub=1; pub == 1 or pub == '1'") 
0.07986264585216674 
timeit.timeit("pub=1; pub in[1, '1']") 
0.07246544186018866 

Und pro Speicherplatz der if ist besser, da Liste

sys.getsizeof([1,"1"]) 
44 
sys.getsizeof(1) 
12 
sys.getsizeof("1") 
22 
sys.getsizeof("1",1) 
22 

Dies ist aufgrund der Tatsache, dass, wenn auch leer etwas mehr Speicher verwendet Liste wird erstellt es braucht Speicherplatz

sys.getsizeof([]) 
36 

Ich weiß nicht, über die best practice aspect

Für mich am meisten pythonic Weg in zu verwenden wäre, da sie die Eingabe

1

1. Performance:

>>> timeit.timeit("pub=1; pub == 1 or pub == '1'", number=10000) 
0.0017161369323730469 
>>> timeit.timeit("pub=1; pub in[1, '1']", number=10000) 
0.0013611316680908203 

2. Best Practice: Es ist gutes Programm in einem pythonic so zu schreiben, ziehe ich (Pub in [1, 1 ' ])

3. Speicherauslastung: Nummer 1 und String '1' wird immer in Python zwischengespeichert, Sie können ve rify die Refcount für diese Objekte. Im Idealfall wird es keinen zusätzlichen Speicher benötigen.

Wenn Sie eine Liste verwenden, die mehr Speicherplatz benötigt, um diese zwischengespeicherten Objekte zu beziehen. (unten ist in 64-Bit-Typ)

Diese 88 Bytes Speicher werden Sie extra zuweisen als die andere Art zu tun.

würde ich vorschlagen, mit zu gehen:

if pub in [1,'1']: 
    #execute funcA() 
0

In Geschwindigkeit:
in schneller ist und durch eine Menge.
Um es zu beweisen, hier ist der Code.

from datetime import datetime 

start0 = datetime.now() 
pub = 1 
if pub == 1 or pub == '1': 
    # execute funcA() 
    pass 
end0 = datetime.now() - start0 
print end0 
start1 = datetime.now() 

if pub in [1, '1']: 
    # execute funcA() 
    pass 
end1 = datetime.now() - start1 
print end1 
print end0 - end1 

Ausgang:

0:00:00.000045 
0:00:00.000007 
0:00:00.000038 

Im Raum: == ist sehr viel besser.
in nimmt O (2) Raum während == O (1) Raum

Nach mir kommt, ist die beste Praxis in verwenden, da es viel schneller und spart eine Menge

Verwandte Themen