پرسیدن چنین سوالی ممکن است کمی عجیب باشد، چرا که پاسخ قاطعانهای وجود ندارد و شما باید براساس یکسری فاکتور و ابزار، نتیجه آنکه کدام نسخه پایتون میتواند سریعترین نسخه باشد را بگیرید.
استفاده از ابزارهای تست کارایی
تیم اصلی توسعه پایتون، به سرعت و کارایی چیزی که ساختهاند بسیار اهمیت میدهند. speed.python.org وبسایتی است که به شما در انجام مقایسه بین نسخههای مختلف پایتون کمک میکند. اما من دو مشکل با این وبسایت دارم. یک آنکه خواندن و درک نتایج بسیار سخت است و دو آنکه نامی از نسخه PyPy که یک پیادهسازی محبوب از پایتون است در اینجا نیامده.
بجای استفاده از این وبسایت من قصد دارم تا از این ابزار برای تست کارایی استفاده کنم. شما میتوانید با اجرای دستور pip install performance این ابزار را روی سیستم خود نصب کنید.
حال با اجرای دستور زیر میتوانید در یک فایل جیسان اطلاعات کاملی از کارایی نسخه پایتونی که میخواهید بدست بیاورید:
pyperformance run --python={chosen_python_runtime} -o my_results.json
البته من این کارها را انجام دادهام و امروز تنها قصد دارم تا نتایجی که بدست آوردهام را با شما به اشتراک بگذارم.
لیست نسخه هایی که من در این مطلب با همدیگر مقایسه کردهام را میتوانید در زیر مشاهده کنید:
- 2.7.10,
- 3.4.4,
- 3.5.4,
- 3.6.1, and
- 3.7 (نسخه بتا)
در کنار این موارد من پیادهسازیهای PyPy(5,6) و PyPy3(5.4.10) را نیز بررسی کردهام.
نتایج
در زیر تلاش داشتهام تا نتایجی که بدست آوردهام را به صورت چارتهایی نشان دهم. در هر چارت زمانها براساس ثانیه قرار گرفتهاند، هر چه مقدار ثانیه کمتر باشد نشان از سریعتر بودن نسخه پایتونی میدهد.
رندر قالبهای HTML
در اولین تست سعی داشتیم تا با استفاده از Template Engine جنگو یک جدول HTML با ۱۵۰ ستون و ردیف را رندر کنیم. نتایج این تست به صورت زیر هستند.
Python 3.7 نسبت به تمامی نسخههای قبلی پایتون سریعتر عمل میکند. نتایجی که بنچمارک اصلی وبسایت پایتون نیز نشان میدهد این موضوع درست است.
اما از طرفی دیگر، PyPy3 نسبت به PyPy5 دو برابر کندتر است.
زمان شروع
زمان شروع به مدت زمانی گفته میشود که یک مفسر کار خود را انجام میدهد. اگر با ساختار GIL و کامپایل به شیوه JIT آشنایی داشته باشید میتوانید این دادهها را بهتر درک کنید.
براساس مشاهداتی که داشتم، متوجه شدم که پایتون نسخه ۲ میتواند سریعترین پایتون برای شروع به کار مفسر باشد. از طرفی دیگر PyPy به دلیل استفاده از کامپایلر JIT نتوانسته نتیجه چشمگیری را از خود نشان دهد.
رمزنگاری
همانطور که مشاهده میکنید، تفاوتهای بسیار چشمگیری بین پایتون ۲ و پایتون ۳ وجود دارد. رمزنگاری امری است که پردازش بالایی نیاز دارد و از آنجایی که پایتون ۳ دیگر از نسخههای ۳۲ بیتی پشتیبانی نمیکند، به مدت زمان بیشتر «اما پردازش بهتری» نیاز دارد.
PyPy نیز در نسخه ۳ خود نسبت به نسخه ۵ تقریبا ۵ برابر کندتر عمل کرده است.
الگوریتم n-queens:
n-queens یک الگوریتم ساده است که تلاش دارد تا n ملکه (وزیر) را روی یک صفحه شطرنج قرار دهد به صورتی که نتوانند همدیگر را بخورند.
مانند دیگر نتایج این بار هم Cpython 3.7 توانست نسبت به دیگر نسخههای Cpython بهتر خود را نشان بدهد. از طرفی دیگر نسخههای PyPy شبیه به همدیگر عمل کردند.
عملیات Floating point
بنچمارک Float یک فرایند ریاضی است که تلاش دارد تا برای یک مقدار، ۱۰۰ هزار عدد شناور را ایجاد کند. توابعی مانند math.sin و math.cos میتوانند برای انجام چنین کاری تنظیم شوند.
برای پیادهسازی PyPy چنین مسائلی به سادگی پیادهسازی میشود چرا که PyPy میتواند به خوبی پردازشهای سنگین را مدیریت کند.
عبارات باقاعده
تست جالبی که انجام دادهایم برای عبارات با قاعده یک نتیجه بسیار جالب را با خود به همراه آورده است. ما در این تست سعی داشتیم تا محتوای ۵۰ برگه محبوب وب را بررسی نماییم و در نهایت دادهها را با استفاده از الگوریتم ROT13 انکود کنیم.
بسیار جالب است که PyPy5 نتوانست نتیجه خوبی کسب کند. به همین خاطر تعجب کردم و تصور کردم که اشتباهی صورت گرفته به همین دلیل با تیم PyPy ارتباط برقرار کردم و آنها این مشکل را در اینجا حل کردند.
آیا پایتون ۳ نسبت به پایتون ۲ سریعتر است؟
بله، تقریبا در تمام تستها میشود این موضوع را دید. در امر رمزنگاری پایتون نسخه ۳ به زمان بیشتری نیاز دارد که این موضوع بدلیل نوع integer است. در زمینه شروع کار مفسر نیز پایتون ۳ کمی کندتر است که این مشکل در بین اعضای تیم اصلی Cpython در حال بررسی است.
در بنچمارکهای اصلی وبسایت پایتون نیز نسخه سوم پایتون حدود ۱.۲ تا ۱.۳ برابر نسبت به نسخه دوم سریعتر است.
چرا PyPy سریعتر است و چرا بجای نسخههای دیگر از آن استفاده نکنیم؟
PyPy سریعتر از Cpython است و این موضوع بدلیل وجود کامپایلر JIT است. JIT برای اجرای کدها و کارهایی که به تکرار نیاز دارند میتواند به خوبی عمل بکند. همانطور که در این تستها مشاهده کردید، PyPy تقریبا در همه تستها به خوبی خود را نشان داد.
یکی از مشکلات اصلی که JIT با آن دست و پنجه نرم میکند مدت زمان شروع مفسر است. همانطور که در تستها مشاهده کردید این زمان بسیار زیاد است. یک مشکل دیگر PyPy سازگاری نداشتن با افزونههای C است که برای پایتون نوشته شدهاند. همانطور که میدانیم Cpython نسخهای از پایتون است که با زبان C نوشته شده است اما PyPy با خود پایتون توسعه داده شده. بسیاری از ماژولهایی که برای Cpython وجود دارند با استفاده از زبان C نوشته شدهاند. این ماژولها با PyPy سازگاری ندارند. برای مثال ماژول Numpy را در نظر بگیرید. این ماژول نمیتواند در PyPy اجرا شود چرا که برای اجرا مستقیما با کامپایلر C ارتباط برقرار میکند.
البته PyPy نیز مشکلاتی با سیستم نسخهبندی خود دارد. برخی از نسخههای آن در حال از کار افتادن هستند، همانطور که پایتون نسخه ۲ قرار است دیگر پشتیبانی نشود.
در پایان
به عنوان نتیجهگیری نهایی باید بگوییم که Python 3.7 سریعترین نسخه رسمی از پایتون و PyPy سریعترین پیادهسازی از پایتون است.
گردآوری و تالیف ارسطو عباسی
آفلاین
من ارسطوام :) کافی نیست؟! :)