পাইথন 3 * এর চেয়ে x**4.0 দ্রুত কেন ?x**4
পাইথন 3 intঅবজেক্টস একটি পূর্ণ আকারযুক্ত বস্তু যা একটি স্বেচ্ছাসেবী আকারকে সমর্থন করার জন্য ডিজাইন করা হয়েছে; এই সত্যের কারণে, সেগুলি সি স্তরে যেমন পরিচালনা করা হয় (দেখুন কীভাবে সমস্ত ভেরিয়েবল PyLongObject *টাইপ হিসাবে ঘোষণা করা হয় long_pow)। এটি তাদের ক্ষয়ক্ষতি আরও অনেক বেশি জটিল এবং ক্লান্তিকর করে তোলে কারণ ob_digitএটি সম্পাদন করার জন্য এটির মানটি উপস্থাপন করতে ব্যবহৃত অ্যারের সাথে আপনার চারপাশে খেলতে হবে। ( উত্স সাহসী জন্য। - দেখুন: পাইথন বড় পূর্ণসংখ্যার সমঝোতা মেমরি অ্যালোকেশন সম্পর্কে আরো জানার জন্য PyLongObject। গুলি)
floatবিপরীতে পাইথন অবজেক্টসকে একটি সি টাইপে (ব্যবহার করে ) রূপান্তরিত করা যায় এবং সেই দেশীয় প্রকারগুলি ব্যবহার করে অপারেশন করা যেতে পারে । এই মহান , কারণ প্রাসঙ্গিক প্রান্ত মামলা চেক পরে, এটি পাইথন পারবেন প্ল্যাটফর্মের 'ব্যবহার ( সি এর , যে ) প্রকৃত exponentiation হ্যান্ডেল করতে:doublePyFloat_AsDoublepowpow
/* Now iv and iw are finite, iw is nonzero, and iv is
* positive and not equal to 1.0. We finally allow
* the platform pow to step in and do the rest.
*/
errno = 0;
PyFPE_START_PROTECT("pow", return NULL)
ix = pow(iv, iw);
যেখানে ivএবং iwআমাদের মূল হয় PyFloatObjectযেমন সি গুলি doubleগুলি।
এটির জন্য মূল্য: 2.7.13আমার জন্য পাইথন 2~3দ্রুততর একটি কারণ , এবং বিপরীত আচরণ দেখায়।
পূর্ববর্তী ঘটনাটি পাইথন 2 এবং 3 এর মধ্যে বৈষম্যকে ব্যাখ্যা করে তাই আমি ভেবেছিলাম যে আমি এই মন্তব্যটিও সম্বোধন করব কারণ এটি আকর্ষণীয়।
পাইথন 2 তে, আপনি পুরানো intঅবজেক্টটি ব্যবহার করছেন যা intপাইথন 3 int-তে ( 3.x তে থাকা সমস্ত বস্তু টাইপযুক্ত PyLongObject) the পাইথন ২-তে, একটি পার্থক্য রয়েছে যা বস্তুর মানের উপর নির্ভর করে (বা, যদি আপনি প্রত্যয় ব্যবহার করেন L/l):
# Python 2
type(30) # <type 'int'>
type(30L) # <type 'long'>
<type 'int'>আপনি এখানে দেখতে একই জিনিস আছে floatগুলি না এটা নিরাপদে একটি সি রূপান্তরিত হয়, long যখন exponentiation এটিতে সঞ্চালিত হয় ( int_pow, এছাড়াও একটি রেজিস্টারে ই.এম. লাগাতে 'কম্পাইলার সংকেতগুলি যদি এটা তা করতে পারেন, যাতে পারে একটি পার্থক্য করতে) :
static PyObject *
int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
{
register long iv, iw, iz=0, ix, temp, prev;
/* Snipped for brevity */
এটি একটি ভাল গতি লাভের অনুমতি দেয়।
<type 'long'>এর তুলনায় তুলনামূলকভাবে কতটা অলস রয়েছে তা দেখার জন্য <type 'int'>, আপনি পাইথন 2 এ কলটিতে xনামটি মুড়ে রাখলে long(মূলত long_powপাইথন 3 এর মতো এটি ব্যবহার করতে বাধ্য করা হয় ), গতি বৃদ্ধি অদৃশ্য হয়ে যায়:
# <type 'int'>
(python2) ➜ python -m timeit "for x in range(1000):" " x**2"
10000 loops, best of 3: 116 usec per loop
# <type 'long'>
(python2) ➜ python -m timeit "for x in range(1000):" " long(x)**2"
100 loops, best of 3: 2.12 msec per loop
নোট নিন যে, যদিও এক স্নিপেট রূপান্তরগুলির intকরতে longযখন অন্যান্য না (@pydsinger দ্বারা সরু আউট হিসাবে), এই ঢালাই মন্দার পিছনে অবদান বল নয়। বাস্তবায়ন long_powহয়। (বিবৃতিগুলি সম্পূর্ণরূপে long(x)দেখার জন্য সময় দিন )।
[...] এটি লুপের বাইরে ঘটে না। [...] সে সম্পর্কে কোন ধারণা?
এটি আপনার জন্য ধ্রুবকগুলি ভাঁজ করে সিপিথনের পিফহোল অপটিমাইজার। আপনি ক্ষতিকারক ফলাফল আবিষ্কার করার জন্য কোনও প্রকৃত গণনা নেই, কেবলমাত্র মূল্যবোধ লোড করার পরে আপনি একই সঠিক সময় পাবেন:
dis.dis(compile('4 ** 4', '', 'exec'))
1 0 LOAD_CONST 2 (256)
3 POP_TOP
4 LOAD_CONST 1 (None)
7 RETURN_VALUE
আইডেন্টিকাল বাইট-কোডটি '4 ** 4.'কেবলমাত্র পার্থক্যের জন্যই তৈরি করা হয় যেটি ইনট এর পরিবর্তে LOAD_CONSTভাসা লোড করে :256.0256
dis.dis(compile('4 ** 4.', '', 'exec'))
1 0 LOAD_CONST 3 (256.0)
2 POP_TOP
4 LOAD_CONST 2 (None)
6 RETURN_VALUE
তাই সময়গুলি অভিন্ন।
* উপরের সমস্তগুলি পাইথনের রেফারেন্স বাস্তবায়নের জন্য শুধুমাত্র সিপিথনের জন্য আবেদন করে। অন্যান্য বাস্তবায়নগুলি ভিন্নভাবে সম্পাদন করতে পারে।