Optimieren Sie gemäß John Fouhys Antwort nicht, es sei denn, Sie müssen, aber wenn Sie hier sind und diese Frage stellen, kann dies genau daran liegen, dass Sie müssen . In meinem Fall musste ich einige URLs aus Zeichenfolgenvariablen zusammenstellen ... schnell. Mir ist aufgefallen, dass (bisher) niemand über die String-Format-Methode nachdenkt, also dachte ich, ich würde das versuchen, und hauptsächlich aus mildem Interesse dachte ich, ich würde den String-Interpolationsoperator für eine gute Messung hineinwerfen. Um ehrlich zu sein, hätte ich nicht gedacht, dass sich beides zu einer direkten '+' - Operation oder einer '' .join () zusammenfügen würde. Aber rate mal was? Auf meinem Python 2.7.5-System regiert der String-Interpolationsoperator sie alle und string.format () ist der schlechteste Performer:
# concatenate_test.py
from __future__ import print_function
import timeit
domain = 'some_really_long_example.com'
lang = 'en'
path = 'some/really/long/path/'
iterations = 1000000
def meth_plus():
'''Using + operator'''
return 'http://' + domain + '/' + lang + '/' + path
def meth_join():
'''Using ''.join()'''
return ''.join(['http://', domain, '/', lang, '/', path])
def meth_form():
'''Using string.format'''
return 'http://{0}/{1}/{2}'.format(domain, lang, path)
def meth_intp():
'''Using string interpolation'''
return 'http://%s/%s/%s' % (domain, lang, path)
plus = timeit.Timer(stmt="meth_plus()", setup="from __main__ import meth_plus")
join = timeit.Timer(stmt="meth_join()", setup="from __main__ import meth_join")
form = timeit.Timer(stmt="meth_form()", setup="from __main__ import meth_form")
intp = timeit.Timer(stmt="meth_intp()", setup="from __main__ import meth_intp")
plus.val = plus.timeit(iterations)
join.val = join.timeit(iterations)
form.val = form.timeit(iterations)
intp.val = intp.timeit(iterations)
min_val = min([plus.val, join.val, form.val, intp.val])
print('plus %0.12f (%0.2f%% as fast)' % (plus.val, (100 * min_val / plus.val), ))
print('join %0.12f (%0.2f%% as fast)' % (join.val, (100 * min_val / join.val), ))
print('form %0.12f (%0.2f%% as fast)' % (form.val, (100 * min_val / form.val), ))
print('intp %0.12f (%0.2f%% as fast)' % (intp.val, (100 * min_val / intp.val), ))
Die Ergebnisse:
# python2.7 concatenate_test.py
plus 0.360787868500 (90.81% as fast)
join 0.452811956406 (72.36% as fast)
form 0.502608060837 (65.19% as fast)
intp 0.327636957169 (100.00% as fast)
Wenn ich eine kürzere Domäne und einen kürzeren Pfad verwende, gewinnt die Interpolation immer noch. Der Unterschied ist jedoch bei längeren Saiten stärker ausgeprägt.
Nachdem ich nun ein schönes Testskript hatte, habe ich auch unter Python 2.6, 3.3 und 3.4 getestet. Hier sind die Ergebnisse. In Python 2.6 ist der Plus-Operator der schnellste! Bei Python 3 gewinnt Join. Hinweis: Diese Tests sind auf meinem System sehr wiederholbar. Daher ist 'plus' in 2.6 immer schneller, 'intp' in 2.7 immer schneller und 'join' in Python 3.x immer schneller.
# python2.6 concatenate_test.py
plus 0.338213920593 (100.00% as fast)
join 0.427221059799 (79.17% as fast)
form 0.515371084213 (65.63% as fast)
intp 0.378169059753 (89.43% as fast)
# python3.3 concatenate_test.py
plus 0.409130576998 (89.20% as fast)
join 0.364938726001 (100.00% as fast)
form 0.621366866995 (58.73% as fast)
intp 0.419064424001 (87.08% as fast)
# python3.4 concatenate_test.py
plus 0.481188605998 (85.14% as fast)
join 0.409673971997 (100.00% as fast)
form 0.652010936996 (62.83% as fast)
intp 0.460400978001 (88.98% as fast)
# python3.5 concatenate_test.py
plus 0.417167026084 (93.47% as fast)
join 0.389929617057 (100.00% as fast)
form 0.595661019906 (65.46% as fast)
intp 0.404455224983 (96.41% as fast)
Lektion gelernt:
- Manchmal sind meine Annahmen absolut falsch.
- Test gegen die Systemumgebung Sie werden in der Produktion laufen.
- String-Interpolation ist noch nicht tot!
tl; dr:
- Wenn Sie 2.6 verwenden, verwenden Sie den Operator +.
- Wenn Sie 2.7 verwenden, verwenden Sie den Operator '%'.
- Wenn Sie 3.x verwenden, verwenden Sie '' .join ().