L'hypothèse que l'on ne devrait jamais utiliser + pour la concaténation de chaîne, mais au lieu de toujours utiliser ".jointure peut être un mythe. Il est vrai que l'utilisation d' +
créer des copies temporaires de immuable objet de type string, mais l'autre n'est pas souvent cité est un fait que l'appelant join
dans une boucle serait généralement ajouter la surcharge d' function call
. Prenons votre exemple.
Créer deux listes, l'une de la de rattachement question et une autre d'un plus fabriqué
>>> myl1 = ['A','B','C','D','E','F']
>>> myl2=[chr(random.randint(65,90)) for i in range(0,10000)]
Permet de créer deux fonctions, UseJoin
et UsePlus
d'utilisation respectifs join
et +
fonctionnalités.
>>> def UsePlus():
return [myl[i] + myl[i + 1] for i in range(0,len(myl), 2)]
>>> def UseJoin():
[''.join((myl[i],myl[i + 1])) for i in range(0,len(myl), 2)]
Permet d'exécuter timeit avec la première liste
>>> myl=myl1
>>> t1=timeit.Timer("UsePlus()","from __main__ import UsePlus")
>>> t2=timeit.Timer("UseJoin()","from __main__ import UseJoin")
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
2.48 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
2.61 usec/pass
>>>
Ils ont presque le même runtime.
Permet d'utiliser cProfile
>>> myl=myl2
>>> cProfile.run("UsePlus()")
5 function calls in 0.001 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 <pyshell#1376>:1(UsePlus)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {range}
>>> cProfile.run("UseJoin()")
5005 function calls in 0.029 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.015 0.015 0.029 0.029 <pyshell#1388>:1(UseJoin)
1 0.000 0.000 0.029 0.029 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
5000 0.014 0.000 0.014 0.000 {method 'join' of 'str' objects}
1 0.000 0.000 0.000 0.000 {range}
Et il semble que l'utilisation de Joindre, les résultats des appels de fonction qui pourrait ajouter à la surcharge.
Maintenant, je reviens à la question. Doit-on décourager l'utilisation de +
sur join
dans tous les cas?
Je ne le pense pas, les choses devraient être pris en considération
- Longueur de la Chaîne en Question
- Pas d'Opération de Concaténation.
Et-cours dans un développement pré-maturité d'optimisation est le mal.