• [^] # Re: Python

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

    Attention. Dans la première version, tu n'utilises pas startswith, et en l'occurence ici, c'est startswith qui est lent.

    In [1]: some_list = 'setanéstebnsetanustebnésatenastubnestpnesanuastnbtsnastbnstanstbnsteanutsenbstanstbnstaà' * 1000
    In [2]: %%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)
    5.55 ms ± 260 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [3]: %%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')]
    10.6 ms ± 253 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    In [4]: %%timeit
     ...: 
     ...: list_a = [s for s in some_list if s[0]=='a']
     ...: list_b = [s for s in some_list if s[0]=='b']
    5.89 ms ± 48.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    Et comme cela a été dit, la manière la plus pythonique, c'est probablement de se poser la question « ai-je vraiment besoin d'une liste ? Un iterable comme un générateur ou le résultat d'un filter ne me suffirait-il pas ? »

    Et c'est la limite de ce genre de truc assez stupide de construction d'objet. Construire une liste n'est pas l'objectif en soit. Et c'est un peu ce que je reproche à nombre de personnes qui font du python qui essaient de mimiquer des constructions classiques alors qu'il faudrait plutôt se poser la question avant. (Même problème dans d'autres langages, en particulier avec le C++ moderne).