2016-09-01 1 views
1

J'ai fait un petit test:Pourquoi il est plus rapide de renvoyer un tuple que plusieurs valeurs en Python?

In [12]: def test1(): 
    ...:  return 1,2,3 
    ...: 

In [13]: def test2(): 
    ...:  return (1,2,3) 
    ...: 

In [14]: %timeit a,b,c = test1() 

Le plus lent course a pris 66,88 fois plus que le plus rapide. Cela peut signifier qu'un résultat intermédiaire est mis en cache. 10000000 boucles, le meilleur de 3: 92,7 ns par boucle

In [15]: %timeit a,b,c = test2() 

Le plus lent course a pris 74.43 fois plus longtemps que le plus rapide. Cela peut signifier qu'un résultat intermédiaire est mis en cache. 10000000 boucles, le meilleur de 3: 80,1 ns par boucle

De retour un tuple est d'environ 15% plus rapide que le retour des valeurs multiples. Pourquoi est-ce vrai?

+0

'' test1' et test2' sont équivalentes en termes de bytecode – vaultah

+0

@vaultah: si 1,2,3 est également un tuple? –

+0

@ Jean-François Fabre oui c'est. –

Répondre

7

Les deux test1 et test2 aboutissent au même bytecode, ils doivent donc fonctionner à la même vitesse. Vos conditions de mesure n'étaient pas cohérentes (par exemple, la charge du processeur a été augmentée pour test2, en raison de processus d'arrière-plan supplémentaires).

>>> import dis 
>>> def test1(): 
...  return 1,2,3 
... 
>>> def test2(): 
...  return (1,2,3) 
... 
>>> dis.dis(test1) 
    2   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 RETURN_VALUE 
>>> dis.dis(test2) 
    2   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 RETURN_VALUE 
>>> 
+0

Avez-vous réexécuté le test pour vérifier? –

+1

@ReutSharabani oui, et les résultats sur ma machine est super bruyant. Je reçois des exécutions où le temps d'exécution de test1 est sur le temps d'exécution de test2, s'exécute où test1 est plus long que test2, s'exécute où test2 est plus long que test1. On s'attend à ce que quelque chose fonctionne en arrière-plan et que vous essayiez de créer un profil très rapide à exécuter. –

+0

ok, parce que mes courses étaient également incompatibles, mais n'ont pas un environnement à tester dans ce qui n'est pas chargé pour le moment. –