Theo câu trả lời của John Fouhy, đừng tối ưu hóa trừ khi bạn phải làm thế, nhưng nếu bạn ở đây và hỏi câu hỏi này, điều đó có thể chính xác là do bạn phải làm . Trong trường hợp của tôi, tôi cần lắp ráp một số URL từ các biến chuỗi ... nhanh. Tôi nhận thấy không ai (cho đến nay) dường như đang xem xét phương pháp định dạng chuỗi, vì vậy tôi nghĩ tôi đã thử nó và, chủ yếu là vì lợi ích nhẹ, tôi nghĩ rằng tôi đã ném toán tử nội suy chuỗi vào đó để kiểm tra tốt. Thành thật mà nói, tôi đã không nghĩ một trong hai thứ này sẽ xếp chồng lên hoạt động '+' trực tiếp hoặc '' .join (). Nhưng đoán xem? Trên hệ thống Python 2.7.5 của tôi, toán tử nội suy chuỗi quy tắc tất cả chúng và string.format () là trình diễn tệ nhất:
# 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), ))
Kết quả:
# 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)
Nếu tôi sử dụng tên miền ngắn hơn và đường dẫn ngắn hơn, phép nội suy vẫn thắng. Sự khác biệt là rõ rệt hơn, mặc dù, với chuỗi dài hơn.
Bây giờ tôi đã có một kịch bản thử nghiệm đẹp, tôi cũng đã thử nghiệm theo Python 2.6, 3.3 và 3.4, đây là kết quả. Trong Python 2.6, toán tử cộng là nhanh nhất! Trên Python 3, tham gia thắng. Lưu ý: các thử nghiệm này rất lặp lại trên hệ thống của tôi. Vì vậy, 'cộng' luôn nhanh hơn trên 2.6, 'intp' luôn nhanh hơn trên 2.7 và 'tham gia' luôn nhanh hơn trên 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)
Bài học kinh nghiệm:
- Đôi khi, giả định của tôi là chết sai.
- Kiểm tra đối với hệ thống env. bạn sẽ được sản xuất
- Nội suy chuỗi chưa chết!
tl; dr:
- Nếu bạn sử dụng 2.6, hãy sử dụng toán tử +.
- nếu bạn đang sử dụng 2.7, hãy sử dụng toán tử '%'.
- nếu bạn đang sử dụng 3.x, hãy sử dụng '' .join ().