• [^] # Re: Python

    Posté par . En réponse au journal Découvrir Docker, Python, LLVM et Emscripten. Évalué à 4.

    Allez, on dégaine un iPython, c'est parti.

    In [4]: some_list = 'setanéstebnsetanustebnésatenastubnestpnesanuastnbtsnastbnstanstbnsteanutsenbstanstbnstaà' * 1000
    In [7]: %%timeit
     ...: 
     ...: list_a = []
     ...: list_b = []
     ...: 
     ...: for s in some_list:
     ...: if s[0] == 'a':
     ...: list_a.append(s)
     ...: elif s[0] == 'b':
     ...: list_b.append(s)
     ...: 
     ...: 
    6.08 ms ± 142 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [8]: %%timeit
     ...: 
     ...: list_a = [s for s in some_list if s.startswith('a')]
     ...: list_b = [s for s in some_list if s.startswith('b')]
     ...: 
     ...: 
    11.8 ms ± 159 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [10]: def starts_with_a(s):
     ...: return s[0] == 'a'
     ...: 
     ...: def starts_with_b(s):
     ...: return s[0] == 'b'
     ...: 
    In [11]: %%timeit
     ...: 
     ...: list_a = list(filter(starts_with_a, some_list))
     ...: list_b = list(filter(starts_with_b, some_list))
     ...: 
     ...: 
    10.4 ms ± 187 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [12]: %%timeit
     ...: generator_a = (s for s in some_list if s.startswith('a'))
     ...: generator_b = (s for s in some_list if s.startswith('b'))
     ...: 
     ...: 
    401 ns ± 1.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    In [13]: %%timeit
     ...: generator_a = (s for s in some_list if s.startswith('a'))
     ...: generator_b = (s for s in some_list if s.startswith('b'))
     ...: 
     ...: len(list(generator_a))
     ...: len(list(generator_b))
     ...: 
     ...: 
    12 ms ± 113 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [14]: len(some_list)
    Out[14]: 88000
    

    Sur une telle liste, moyennement grosse, les générateurs ont l'air d'aller légèrement plus vite. C'était un test rapide et sûrement pourrave.