اختبار سرعة بين لغة Paython و C

  • kikoknkn

الاختبار سيتم بحساب الزمن اللازم لحل معضلة رياضية بالارقام الصحيحة و تكرارها 1000000 مرة

حيث أن المعضلة الرياضية هي ايجاد حل مجموعة معادلتان

x + y = 14

x^2 + y^2 = 100

وبرنامجهما كالتالي

Python3:

x = 1
for i in range(1000000):
   while x <= 14:
      y = 14 – x
      if x**2 + y**2 == 100:
         break
      x = x + 1
print (str(x) + “|” + str(y))

c:

#include <stdio.h>

int main() {
   int x, y;
   for (int i=0; i<1000000;i++){
      for (x = 1; x <= 14; x++) {
         y = 14 – x;
         if ((x*x) + (y*y) == 100)
            break;
      }
   }
printf(“%d|%d\n”, x, y);
return 0;
}

و باستخدام نظام تشغيل لينوكس تم الاختبار باستخدام التعليمتان

time ./cspeed 

real 0m0.052s user 0m0.048s sys 0m0.000s

time python pspeed.py 

real 0m0.706s user 0m0.700s sys 0m0.004s

وكانت النتائج

أن البرنامج بلغة Python استغرق 13 ضعف زمن برنامج c لتنفيز نفس المهمة

بانتظار اقتراحاتكم لتطوير هذا الاختبار البسيط المصدر

http://cocktail-it.com/c-vs...

تعديل أول تم تصحيح موقع تعليمة x = 1

وبعد التصحيح اصبح الزمن time python pspeed.py

real 0m4.005s

user 0m3.989s

sys 0m0.004s

وأصبحت النتائج

أن البرنامج بلغة Python استغرق 77 ضعف زمن برنامج c لتنفيز نفس المهمة

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

طبعا البايثون ابطا، لأن البايثون مكتوب بلغة السي

و الفرق الاخر ان البايثون لغة عالية جدا ( قريبة من لغة البشر الطبيعية ) ، اما السي لغة متدنية ( قريبة من لغة الالة )، اي ان البايثون يكون بها الانتاجية اكثر بمرات كثيرة، و هذه تبرر استعمالها مع انها ابطأ قليلا

kikoknkn أضف ردا

تحليلك في مكانه ...

ولكنني أردت أن استطيع قياس ومقارنة هذا البطء ... " بشكل قابل للقياس "

وبأخذ الانتاجية " أي الفترة الزمنية لكتابة الكود لمشروع " بعين الاعتبار تكون كلفة البرامج بلغة C أعلى و سرعتها اعلى ...

مجهول
  • حذف بواسطة المستخدم

اختبارك يشمل الوقت الذي تستغرقه بايثون في ترجمة البرنامج قبل تنفيذه بينما برنامج السي مترجم مسبقاً ووقت الترجمة لا يحسب هنا.. إذا أردت فقط الوقت الذي يستغرقه البرنامج داخل الحلقة فيجب عليك حساب الوقت داخل البرنامج نفسه بدل استخدام الأمر time. المتوقع إذا فعلت ذلك أن يتقلص الفارق كثيراً مع بقاء السي في المقدمة.

قمت بحساب الزمن اللازم للترجمة وكان

0.022 ثانية

وهو يعادل 6 بالالف من اجمالي زمن التنفيذ للبرنامج

شي طبيعي تكون C أسرع

محاولتي كانت لمعرفة مقدار الفرق ...

أخي برنامج البايثون الذي اختبرت عليه خطأ .

فالبرنامج يقوم في المرة الأولى بحساب ال x من الرقم 1 حتى يصل الى الجواب برقم 6 ثم يخرج من ال loop .

في لمحاولات ال 99999 الباقية ال loop تبدأ من الرقم 6 و بما أن الرقم 6 جواب صحيح بكل بساطة تخرج مباشرة من ال loop .

هذا يعني أنه بدلا من أن يقوم الرنامج بعمل 1000000 * 6= 6000000 محاولات للحل . البرنامج المكتوب يقوم بعمل 6 + 99999 = 1000005محاولات و هذا تقريبا 1/6 من رقم المحاولات التي يجب أن تتم .

بعد تصحيح البرنامج ستجد أن برنامج البايثون أبطأ ب 13 * 6 = 78 مرة من ال c

التصحيح بسيط فقط انقل السطر x=1 الى ما بعد for i in range(1000000):

فالبرنامج يصبح هكذا :

for i in range(1000000):
 x = 1
  while x <= 14:
     y = 14  - x
     if x**2 + y**2 == 100:
        break
     x = x + 1
print (str(x) + "|" + str(y))

طبعا يمكن تطوير البرنامج بحيث يصبح أفضل من ناحية الأداء بتغيير نوع ال loop و التخلص من اضافة 1 الى x كل دورة

from itertools import repeat
for _ in repeat(None, 1000000):
   for x in range(1,14):
      y = 14  - x
      if x**2 + y**2 == 100:
         break
print (str(x) + "|" + str(y))

هذا التطوير يحسن البرنامج بنسبة بسيطة لن تغير في الفرق بالسرعة بين python و c

مشكور على التصحيح ...

فيما يخص موقع تعليمة

x = 1

وبخصوص اقتراحك الثاني ... أنا حاولت أن يكون البرنامجان شبه متطابقان بمنطق الحل وعدد العمليات الرياضية المنجزة

وبعد التصحيح اصبح الزمن

  time python pspeed.py

real 0m4.005s

user 0m3.989s

sys 0m0.004s

وأصبح الفرق 77 ضعف