আমি বাছাই করা_সামগ্রীগুলির উত্সটির দিকে চেয়ে ছিলাম এবং এই লাইনটি দেখে অবাক হয়েছি :
self._load, self._twice, self._half = load, load * 2, load >> 1
এখানে load
একটি পূর্ণসংখ্যা কেন এক জায়গায় বিট শিফট এবং অন্য জায়গায় গুণ? এটি যুক্তিসঙ্গত বলে মনে হচ্ছে যে বিট স্থানান্তরটি 2 দ্বারা অবিচ্ছেদ্য বিভাগের চেয়ে দ্রুততর হতে পারে, তবে কেন একটি শিফ্ট দ্বারা গুণনটি প্রতিস্থাপন করবেন না? আমি নিম্নলিখিত বিষয়গুলিকে বেঞ্চমার্ক করেছি:
- (বার, ভাগ)
- (শিফট, শিফট)
- (বার, শিফট)
- (শিফট, বিভাজন)
এবং দেখা গেছে যে # 3 অন্যান্য বিকল্পের তুলনায় ধারাবাহিকভাবে দ্রুত:
# self._load, self._twice, self._half = load, load * 2, load >> 1
import random
import timeit
import pandas as pd
x = random.randint(10 ** 3, 10 ** 6)
def test_naive():
a, b, c = x, 2 * x, x // 2
def test_shift():
a, b, c = x, x << 1, x >> 1
def test_mixed():
a, b, c = x, x * 2, x >> 1
def test_mixed_swapped():
a, b, c = x, x << 1, x // 2
def observe(k):
print(k)
return {
'naive': timeit.timeit(test_naive),
'shift': timeit.timeit(test_shift),
'mixed': timeit.timeit(test_mixed),
'mixed_swapped': timeit.timeit(test_mixed_swapped),
}
def get_observations():
return pd.DataFrame([observe(k) for k in range(100)])
প্রশ্নটি:
আমার পরীক্ষা কি বৈধ? যদি তা হয় তবে (শিফট, শিফট) তুলনায় কেন (গুন, শিফট) দ্রুত?
আমি উবুন্টু 14.04 এ পাইথন 3.5 চালাচ্ছি।
সম্পাদন করা
উপরে প্রশ্নের মূল বক্তব্য রয়েছে। ড্যান গেটেজ তার উত্তরে একটি দুর্দান্ত ব্যাখ্যা সরবরাহ করে।
সম্পূর্ণতার স্বার্থে, x
গুণনের অপ্টিমাইজেশন প্রয়োগ না করা হলে বৃহত্তর জন্য নমুনার চিত্রগুলি এখানে দেওয়া হয় ।
x
খুব বড় হয়, কারণ এটি ঠিক কীভাবে এটি মেমরির মধ্যে সংরক্ষণ করা হয় একটি প্রশ্ন, তাই না?
x
?