প্রতি জন Fouhy এর উত্তর হিসেবে অপ্টিমাইজ যদি না আপনি না থাকে, কিন্তু যদি আপনি এখানে এসেছি এবং এই প্রশ্ন জিজ্ঞাসা, এটা অবিকল হতে পারে কারণ আপনার আছে । আমার ক্ষেত্রে, স্ট্রিং ভেরিয়েবলগুলি থেকে আমার কয়েকটি URL একত্রিত করা দরকার ... দ্রুত। আমি লক্ষ্য করেছি যে কেউ (এখনও অবধি) স্ট্রিং ফর্ম্যাট পদ্ধতিটি বিবেচনা করছে বলে মনে হচ্ছে না, তাই আমি ভেবেছিলাম যে আমি এটি চেষ্টা করব এবং বেশিরভাগ মৃদু স্বার্থের জন্য, আমি ভেবেছিলাম যে ভাল মাপকের জন্য সেখানে স্ট্রিং ইন্টারপোলেশন অপারেটরটি টস করব। সত্যি কথা বলতে, আমি ভাবিনি যে এগুলির কোনওটি সরাসরি '+' অপারেশন বা '' .জয়াইন () পর্যন্ত সজ্জিত হবে। কিন্তু অনুমান করতে পার কি? আমার পাইথন ২.7.৫ সিস্টেমে স্ট্রিং ইন্টারপোলেশন অপারেটর তাদের সকলকে নিয়ম করে এবং স্ট্রিং.ফোর্ম্যাট () সবচেয়ে খারাপ পারফর্মার:
# 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)
যদি আমি একটি আরও ছোট ডোমেন এবং আরও ছোট পথ ব্যবহার করি, তবে ইন্টারপোলেশনটি এখনও জিততে পারে। পার্থক্যটি আরও স্পষ্ট হয় যদিও দীর্ঘতর স্ট্রিং সহ।
এখন যেহেতু আমার কাছে একটি দুর্দান্ত স্ক্রিপ্ট রয়েছে, আমি পাইথন ২.6, ৩.৩ এবং ৩.৪ এর অধীনেও পরীক্ষা করেছিলাম, ফলাফল এখানে the পাইথন ২.6-তে, প্লাস অপারেটরটি সবচেয়ে দ্রুত! পাইথন 3-এ জয়ী হয়ে জয়েন করুন। দ্রষ্টব্য: এই পরীক্ষাগুলি আমার সিস্টেমে খুব পুনরাবৃত্তিযোগ্য। সুতরাং, 'প্লাস' সর্বদা ২.6-তে দ্রুত, 'ইন্টিপি' সর্বদা ২.7-তে দ্রুত এবং 'যোগ' পাইথন ৩.x-তে সর্বদা দ্রুত থাকে So
# 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)
পাঠ শিখেছে:
- কখনও কখনও, আমার অনুমানগুলি ভুল হয়ে গেছে।
- সিস্টেমের বিরুদ্ধে পরীক্ষা আপনি উত্পাদন চলমান হবে।
- স্ট্রিং ইন্টারপোলেশন এখনও মারা যায় নি!
TL; ড:
- আপনি যদি ২.6 ব্যবহার করেন তবে + অপারেটরটি ব্যবহার করুন।
- আপনি যদি 2.7 ব্যবহার করেন তবে '%' অপারেটর ব্যবহার করুন।
- আপনি যদি 3.x ব্যবহার করেন তবে '' .জাইন () ব্যবহার করুন।