পাইথন 3 * এর চেয়ে x**4.0
দ্রুত কেন ?x**4
পাইথন 3 int
অবজেক্টস একটি পূর্ণ আকারযুক্ত বস্তু যা একটি স্বেচ্ছাসেবী আকারকে সমর্থন করার জন্য ডিজাইন করা হয়েছে; এই সত্যের কারণে, সেগুলি সি স্তরে যেমন পরিচালনা করা হয় (দেখুন কীভাবে সমস্ত ভেরিয়েবল PyLongObject *
টাইপ হিসাবে ঘোষণা করা হয় long_pow
)। এটি তাদের ক্ষয়ক্ষতি আরও অনেক বেশি জটিল এবং ক্লান্তিকর করে তোলে কারণ ob_digit
এটি সম্পাদন করার জন্য এটির মানটি উপস্থাপন করতে ব্যবহৃত অ্যারের সাথে আপনার চারপাশে খেলতে হবে। ( উত্স সাহসী জন্য। - দেখুন: পাইথন বড় পূর্ণসংখ্যার সমঝোতা মেমরি অ্যালোকেশন সম্পর্কে আরো জানার জন্য PyLongObject
। গুলি)
float
বিপরীতে পাইথন অবজেক্টসকে একটি সি টাইপে (ব্যবহার করে ) রূপান্তরিত করা যায় এবং সেই দেশীয় প্রকারগুলি ব্যবহার করে অপারেশন করা যেতে পারে । এই মহান , কারণ প্রাসঙ্গিক প্রান্ত মামলা চেক পরে, এটি পাইথন পারবেন প্ল্যাটফর্মের 'ব্যবহার ( সি এর , যে ) প্রকৃত exponentiation হ্যান্ডেল করতে:double
PyFloat_AsDouble
pow
pow
/* 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.0
256
dis.dis(compile('4 ** 4.', '', 'exec'))
1 0 LOAD_CONST 3 (256.0)
2 POP_TOP
4 LOAD_CONST 2 (None)
6 RETURN_VALUE
তাই সময়গুলি অভিন্ন।
* উপরের সমস্তগুলি পাইথনের রেফারেন্স বাস্তবায়নের জন্য শুধুমাত্র সিপিথনের জন্য আবেদন করে। অন্যান্য বাস্তবায়নগুলি ভিন্নভাবে সম্পাদন করতে পারে।