টিএল; ডিআর - সমস্যা 21118
দীর্ঘ গল্প
জোশ রোজেনবার্গ জানতে পেরেছিলেন যে str.translate()
ফাংশনটি এর তুলনায় খুব ধীর গতির bytes.translate
, তিনি একটি ইস্যু উত্থাপন করে বলেছেন যে:
পাইথন 3-এ, str.translate()
সাধারণত একটি পারফরম্যান্স হতাশা, অপ্টিমাইজেশন নয়।
str.translate()
ধীর ছিল কেন ?
str.translate()
খুব ধীর হওয়ার মূল কারণটি ছিল পাইথন অভিধানে লুকআপটি ব্যবহৃত হত।
ব্যবহারটি maketrans
এই সমস্যাটিকে আরও খারাপ করে তুলেছে। একই ধরণের পদ্ধতির সাহায্যে bytes
দ্রুত সারণী দেখার জন্য 256 আইটেমের একটি সি অ্যারে তৈরি করা হয়। সুতরাং উচ্চ স্তরের পাইথনের ব্যবহার পাইথন 3.4-এ খুব ধীর করে dict
তোলে str.translate()
।
এখন কি হল?
প্রথম পদ্ধতির একটি ছোট প্যাচ, অ্যাড ছিল translate_writer , যাইহোক গতি বৃদ্ধি যে আনন্দদায়ক ছিল না। শীঘ্রই অন্য একটি প্যাচ দ্রুত_পরিচালনার পরীক্ষা করা হয়েছিল এবং এটি 55% পর্যন্ত স্পিডআপের খুব সুন্দর ফলাফল পেয়েছিল।
ফাইলটি থেকে দেখা যায় মূল পরিবর্তনটি হ'ল পাইথন অভিধানের অনুসন্ধানটি সি স্তরের অনুসন্ধানে পরিবর্তিত হয়েছে।
গতি এখন প্রায় একই bytes
unpatched patched
str.translate 4.55125927699919 0.7898181750006188
str.translate from bytes trans 1.8910855210015143 0.779950579000797
এখানে একটি ছোট নোটটি হল যে ASCII স্ট্রিংগুলিতে পারফরম্যান্স বর্ধন কেবল বিশিষ্ট।
যেহেতু জেএসবেসটিস্টিয়ান নীচে একটি মন্তব্যে উল্লেখ করেছেন , ৩.৫ এর পূর্বে অনুবাদ ASCII এবং নন-এএসসিআইআই উভয় ক্ষেত্রে একইভাবে কাজ করতে ব্যবহৃত হয়েছিল। তবে ৩.৩ থেকে এএসসিআইআই কেসটি অনেক দ্রুত।
আগে এএসসিআইআই বনাম অ এস্কি প্রায় একই রকম ছিল, তবে এখন আমরা পারফরম্যান্সে দুর্দান্ত পরিবর্তন দেখতে পাচ্ছি।
এই উত্তরে দেখা গেছে এটি 71.6μ থেকে 2.33μ এর উন্নতি হতে পারে ।
নিম্নলিখিত কোডটি এটি দেখায়
python3.5 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
100000 loops, best of 3: 2.3 usec per loop
python3.5 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 117 usec per loop
python3 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 91.2 usec per loop
python3 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
10000 loops, best of 3: 101 usec per loop
ফলাফলের সারণী:
Python 3.4 Python 3.5
Ascii 91.2 2.3
Unicode 101 117
dict.fromkeys(ord(c) for c in '@#$')
?