J'effectue un appel AJAX et je lui transmets la variable pub qui peut être 1 ou 0.

En tant que débutant, je veux être sûr du type de variable qui arrive. Je suis conscient que je peux facilement convertir en int() et le problème n'est en fait pas avec le résultat AJAX mais cela a conduit à cette question.

Mon code:

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

Mais ce qui précède n'est pas si pythonique pour moi, j'ai donc essayé:

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

Lequel du code ci-dessus est le meilleur en termes de:

  1. Performance (vitesse).
  2. Meilleur entrainement.
  3. Utilisation de la mémoire.
10
Yax 15 juil. 2015 à 08:38

6 réponses

Meilleure réponse

Performances : c'est mieux

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

Donc, {} > or > [] > () en fonction des performances.

Entraînement : in est préférable car il est moins difficile à taper. (), [], {} tout aussi bon selon la pratique

Mémoire :

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

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

Donc, {} > [] > () > or basé sur la mémoire

Bien que cela ne soit pas demandé ,, bon à savoir:

Fonctionnalité : valoriser l'égalité et non pas l'égalité de référence

in est juste une vérification séquentielle de l'égalité ==. Si similaire. in utilise == et non is. Ce que je veux dire, c'est ceci:

>>> 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

Il est donc implémenté pas comme ceci:

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

is renverra True si deux variables pointent vers le même objet, == si les objets référencés par les variables sont égaux. in utilise ==

12
sinhayash 15 juil. 2015 à 06:32

Par conséquent, les performances in sont meilleures:

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

Et selon l'espace mémoire, le if est meilleur car la liste utilise un peu plus de mémoire

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

Cela est dû au fait que même si une liste vide est créée, cela prend de l'espace mémoire

sys.getsizeof([])
36

Je ne connais pas le best practice aspect

Pour moi, la façon la plus pythonique serait d'utiliser in car cela réduit la saisie

3
The6thSense 15 juil. 2015 à 06:35

1. Performances:

>>> 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. Bonne pratique: C'est bien d'écrire le programme d'une manière pythonique que je préfère (pub dans [1, '1'])

3. Utilisation de la mémoire: numéro 1 et la chaîne «1» est toujours mise en cache en python, vous pouvez vérifier le refcount pour ces objets. Donc, idéalement, cela ne prendra pas de mémoire supplémentaire.

>>> sys.getrefcount(1)
833
>>> sys.getrefcount('1')
16

Si vous utilisez une liste qui a besoin de plus de mémoire doit être allouée pour référencer ces objets mis en cache. (ci-dessous est en type 64 bits)

>>> sys.getsizeof([1, '1'])
88

Ces 88 octets de mémoire que vous allez allouer plus que l'autre façon de faire.

Je suggérerais d’aller avec:

if pub in [1,'1']:
    #execute funcA()
1
gsb-eng 15 juil. 2015 à 06:54

En vitesse:
in est plus rapide et beaucoup.
Pour le prouver, voici le 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

Production:

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

Dans l'espace: == est bien mieux.
in prend l'espace O (2) tandis que == prend l'espace O (1)

Selon moi, la meilleure pratique consiste à utiliser in car il est beaucoup plus rapide et économise beaucoup de frappe

0
rrao 11 déc. 2016 à 14:40

Pas vraiment vrai. Si vous changez l'ordre, vous verrez un résultat différent, mettez simplement l'ordre ci-dessous:

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

start0 = datetime.now()
if pub == 1 or pub == '1':
    # execute funcA()
    pass
end0 = datetime.now() - start0
print end0
start1 = datetime.now()
0
Alex 19 mars 2019 à 18:30

Ce code est meilleur

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

Car il est légèrement plus rapide, mais principalement parce qu'il n'est pas redondant . La variable pub n'y apparaît qu'une seule fois.

7
dlask 15 juil. 2015 à 05:50