পাইথন ৩.৪ এর তুলনায় পাইথন ৩.৫-এ স্ট্রিং ট্রান্সলেট কেন দ্রুত হয়?


116

আমি text.translate()পাইথন ৩.৪ ব্যবহার করে প্রদত্ত স্ট্রিং থেকে অযাচিত অক্ষরগুলি সরিয়ে দেওয়ার চেষ্টা করছিলাম ।

সর্বনিম্ন কোডটি হ'ল:

import sys 
s = 'abcde12345@#@$#%$'
mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$')
print(s.translate(mapper))

এটি প্রত্যাশার মতো কাজ করে। তবে একই প্রোগ্রামটি যখন পাইথন ৩.৪ এবং পাইথন ৩.৩ এ কার্যকর করা হয়েছিল তখন একটি বড় পার্থক্য দেয়।

সময় গণনা করার কোডটি

python3 -m timeit -s "import sys;s = 'abcde12345@#@$#%$'*1000 ; mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$'); "   "s.translate(mapper)"

পাইথন ৩.৪ প্রোগ্রামটি ১.৩ মিমি নিয়ে থাকে তবে পাইথন ৩.৫-তে একই প্রোগ্রামটি কেবল ২ 26.৪μ ভাগ সময় নেয় ।

পাইথন ৩.৪-তে কী উন্নতি হয়েছে যা পাইথন ৩.৪ এর তুলনায় এটিকে দ্রুত করে তোলে?


11
আমরা কর্মক্ষমতা বিষয়ে কথা বলছি, তাহলেও এটি হবে না এই মত আপনার ম্যাপার ভাল জেনারেট করতে: dict.fromkeys(ord(c) for c in '@#$')?
থমাস কে

1
@ থমাসক আমি জানতে পেরেছি যে এটি একটি উল্লেখযোগ্য পার্থক্য করেছে। হ্যাঁ আপনার উপায় ভাল।
ভার্গব রাও

আপনার মানে 50x দ্রুত?
Assylias

@ এ্যাসেলিয়াস আমি 1300 করেছি - 26.4 এবং তারপরে 1300 দিয়ে ভাগ করেছি I আমি গণিতে কিছুটা দুর্বল। আমি শিগগিরই গণিত শিখব। :)
ভরতভ রাও

3
আপনার এটি পুরোপুরি করা উচিত: 26/1300 = 2% তাই দ্রুততম সংস্করণটি ধীর সংস্করণে নেওয়া 2% সময় নেয় => এটি 50x দ্রুত।
Assylias

উত্তর:


148

টিএল; ডিআর - সমস্যা 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


দ্রষ্টব্য: অ্যাস্কি বনাম অ-এসকিআই কেস পারফরম্যান্সে উল্লেখযোগ্যভাবে আলাদা হতে পারে। এটি প্রায় 55% নয়: যেমন আপনার উত্তরটি দেখায়, গতি 1000বাড়ানো% s হতে পারে
jfs

তুলনা: python3.5 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"(ascii) বনাম python3.5 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"(অ- ascii)। দ্বিতীয়টি অনেকটা (10x) ধীর।
jfs

@ জেএফ ওহ, আমি এখন এটি বুঝতে পেরেছি। আমি আপনার কোড 3.4 এবং 3.5 হিসাবে চালিয়েছি। অ-অ্যাস্কি স্টাফের জন্য আমি পাই3.4 দ্রুত পাচ্ছি। এটা কি কাকতালীয়ভাবে? ফলাফল dpaste.com/15FKSDQ
রাও

3.5 এর আগে, উভয়ই এসসিআই এবং নন-এসসিআই কেস সম্ভবত ইউনিকোডের .translate()ক্ষেত্রে একই , যেমন, পাইথন ৩.৫-তে এসকিআই কেস খুব দ্রুত হয় (আপনাকে bytes.translate()সেখানে পারফরম্যান্সের দরকার নেই)।
jfs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.