Sesuai jawaban John Fouhy, jangan mengoptimalkan kecuali Anda harus, tetapi jika Anda di sini dan mengajukan pertanyaan ini, itu mungkin karena Anda harus melakukannya . Dalam kasus saya, saya perlu mengumpulkan beberapa URL dari variabel string ... cepat. Saya perhatikan tidak seorang pun (sejauh ini) tampaknya mempertimbangkan metode format string, jadi saya pikir saya akan mencobanya dan, sebagian besar untuk minat ringan, saya pikir saya akan melemparkan operator interpolasi string di sana untuk pengukuran yang baik. Sejujurnya, saya tidak berpikir salah satu dari ini akan menumpuk ke operasi '+' langsung atau '' .join (). Tapi coba tebak? Pada sistem Python 2.7.5 saya, operator interpolasi string mengatur semuanya dan string.format () adalah yang berkinerja terburuk:
# 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), ))
Hasil:
# 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)
Jika saya menggunakan domain yang lebih pendek dan jalur yang lebih pendek, interpolasi masih menang. Perbedaannya lebih jelas, dengan string yang lebih panjang.
Sekarang saya memiliki skrip pengujian yang bagus, saya juga menguji dengan Python 2.6, 3.3 dan 3.4, inilah hasilnya. Dalam Python 2.6, operator plus adalah yang tercepat! Pada Python 3, bergabunglah menang. Catatan: tes ini sangat berulang pada sistem saya. Jadi, 'plus' selalu lebih cepat di 2.6, 'intp' selalu lebih cepat di 2.7 dan 'join' selalu lebih cepat di Python 3.x.
# 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)
Pelajaran yang dipelajari:
- Terkadang, asumsi saya salah.
- Uji terhadap sistem id. Anda akan berjalan dalam produksi.
- Interpolasi string belum mati!
tl; dr:
- Jika Anda menggunakan 2.6, gunakan operator +.
- jika Anda menggunakan 2.7 gunakan operator '%'.
- jika Anda menggunakan 3.x gunakan '' .join ().