ในฐานะที่เป็นคำตอบต่อจอห์น Fouhy ของไม่ได้เพิ่มประสิทธิภาพจนกว่าคุณจะมี แต่ถ้าคุณอยู่ที่นี่และถามคำถามนี้ก็อาจจะเป็นได้อย่างแม่นยำเพราะคุณต้อง ในกรณีของฉันฉันต้องการรวบรวม URL บางส่วนจากตัวแปรสตริง ... เร็วขึ้น ฉันสังเกตเห็นว่าไม่มีใคร (จนถึง) ดูเหมือนกำลังพิจารณาวิธีการจัดรูปแบบสตริงดังนั้นฉันคิดว่าฉันลองและส่วนใหญ่ที่น่าสนใจฉันคิดว่าฉันจะโยนตัวดำเนินการแก้ไขสตริงที่นั่นสำหรับผู้วัดที่ดี พูดตามตรงฉันไม่คิดว่าสิ่งเหล่านี้จะทำให้การดำเนินงาน '+' โดยตรงหรือ '' .join () แต่คาดเดาอะไร ในระบบ Python 2.7.5 ของฉันตัวดำเนินการแก้ไขสตริงจะควบคุมกฎทั้งหมดและ string.format () เป็นตัวดำเนินการที่แย่ที่สุด:
# 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), ))
ผลลัพธ์ที่ได้:
# 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)
ถ้าฉันใช้โดเมนที่สั้นลงและเส้นทางที่สั้นลงการแก้ไขก็ยังคงมีชัยอยู่ ความแตกต่างนั้นเด่นชัดมากขึ้นแม้ว่าจะมีสตริงที่ยาวกว่า
ตอนนี้ฉันมีสคริปต์ทดสอบที่ดีฉันยังทดสอบภายใต้ Python 2.6, 3.3 และ 3.4 ด้วยผลลัพธ์ที่นี่ ใน Python 2.6 ตัวดำเนินการบวกเร็วที่สุด! บน Python 3 เข้าร่วมรับรางวัล หมายเหตุ: การทดสอบเหล่านี้สามารถทำซ้ำได้ในระบบของฉัน ดังนั้น 'plus' จะเร็วขึ้นเสมอบน 2.6 'intp' จะเร็วขึ้นเสมอที่ 2.7 และ 'เข้าร่วม' จะเร็วขึ้นใน 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)
บทเรียน:
- บางครั้งสมมติฐานของฉันผิดไป
- ทดสอบกับระบบ env คุณจะทำงานในการผลิต
- การแก้ไขสตริงยังไม่ตาย!
TL; DR:
- หากคุณใช้ 2.6 ให้ใช้ตัวดำเนินการ +
- หากคุณใช้ 2.7 ให้ใช้โอเปอเรเตอร์ '%'
- หากคุณใช้ 3.x use '' .join ()