313 votes

Pourquoi n'y a-t-il pas de fonction xrange en Python3?

Récemment, j'ai commencé à utiliser Python3 et son absence de xrange fait mal.

Exemple simple:

  1. Python2:

    from time import time as t
    def count():
      st = t()
      [x for x in xrange(10000000) if x%4 == 0]
      et = t()
      print et-st
    count()
  2. Python3:

    from time import time as t
    
    def xrange(x):
    
        return iter(range(x))
    
    def count():
        st = t()
        [x for x in xrange(10000000) if x%4 == 0]
        et = t()
        print (et-st)
    count()

Les résultats sont respectivement:

  1. 1.53888392448
  2. 3.215819835662842

Pourquoi? Je veux dire, pourquoi xrange a été supprimé? C'est un outil formidable pour apprendre. Pour les débutants, comme moi-même, comme nous l'avons tous été à un moment donné. Pourquoi le supprimer? Est-ce que quelqu'un peut me pointer vers le bon PEP, je ne le trouve pas.

-1voto

dmitriy Points 11

comp:~$ python Python 2.7.6 (par défaut, 22 juin 2015, 17:58:13) [GCC 4.8.2] sur linux2

>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",nombre=100)

5.656799077987671

>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",nombre=100)

5.579368829727173

>>> timeit.timeit("[x for x in range(1000000) if x%4]",nombre=100)

21.54827117919922

>>> timeit.timeit("[x for x in range(1000000) if x%4]",nombre=100)

22.014557123184204

Avec le paramètre de temps timeit nombre=1:

>>> timeit.timeit("[x for x in range(1000000) if x%4]",nombre=1)

0.2245171070098877

>>> timeit.timeit("[x for x en xrange(1000000) if x%4]",nombre=1)

0.10750913619995117

comp:~$ python3 Python 3.4.3 (par défaut, 14 octobre 2015, 20:28:29) [GCC 4.8.4] sur linux

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=100)

9.113872020003328

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=100)

9.07014398300089

Avec le paramètre de temps timeit nombre=1,2,3,4 fonctionne rapidement et de manière linéaire :

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=1)

0.09329321900440846

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=2)

0.18501482300052885

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=3)

0.2703447980020428

>>> timeit.timeit("[x for x en range(1000000) if x%4]",nombre=4)

0.36209142999723554

Il semble donc que si nous mesurons un cycle de boucle d'exécution comme timeit.timeit("[x pour x en range(1000000) si x%4]",nombre=1) (comme nous l'utilisons réellement dans le code) python3 fonctionne assez rapidement, mais dans les boucles répétées xrange() de python 2 l'emporte en vitesse sur range() de python 3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X