الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقارنة خاطفة بين python و php و perl

بدأه password123 في 17 مايو 2011 · 42 رد · 3,195 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#26

انت على i5 :ohmy:

*** احترامي الشديد ****

لو كنت على لينكس كان ممكن تقوم بقص ولصق لمحتوى ملف /proc/cpuinfo :D

بالنسبة ل rea, user, system فهذا ليس كلامي.. الامر time يطبعها ويعني:

* real: هذا الذي انظر اليه انا.. الوقت المحسوب منذ ان كبست enter الى ان انتهى البرنامج بالتمام (كل شيء)

* user: الوقت المستهلك لتطبيق الاوامر في الprocess(es) هذه فقط

* system: الوقت المستهلك لتطبيق اوامر في kernel ناتجة من اوامر في تلك الprocess(es)

man 1 time يحتوي على تفاصيل اكثر.. وتفاصيل اكثر في man 2 times

1

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#27

بناءً على القاعدة الذهبية أنه لا يوجد شئ اسمه "لغة أسرع من لغة" بل "implementation أسرع من implementation" قررت اختبار 2 implementation للغة واحدة. اللغة هي بايثون (طبعاً :cool: ) والاختبار بين Python العادية أو ما يعرف بـCPython المبنية على C، وIronPython المبنية على دوت نت. وقررت استخدام برنامج استخدمته لحل المسألة 51 من مسائل Euler. كلا النسختين هي 2.7.

مواصفات الجهاز:

Intel Core2Duo E6550 @ 2.33 GHz

2.98 GB RAM

Windows XP SP3

الكود:

اقتباس


import math

digits = [0,1,2,3,4,5,6,7,8,9]
digitsWithMask = list(map(lambda x: str(x), digits))
digitsWithMask.append('*')
primes = [2,3]
targetCount = 8

def isPrime(n):
if n in primes:
return True
if n == 1:
return False
if n < 4:
return True
if n % 2 == 0:
return False
if n < 9:
return True
if n % 3 == 0:
return False
r = math.floor(math.sqrt(n))
f = 5
while f<=r:
if n % f == 0:
return False
if n % (f+2) == 0:
return False
f+=6

return True


def addDigit(size, digitsSoFar, results):
pool = []
if len(digitsSoFar) == 0:
pool = [x for x in digitsWithMask if x!='0']
else:
pool = digitsWithMask

size -=1
if size == 0 and '*' not in digitsSoFar:
results.append(digitsSoFar + '*')
else:
for digit in pool:
newDigit = digitsSoFar + digit

if size == 0:
results.append(newDigit)
else:
addDigit(size, newDigit, results)

def getPermutations(size):
results = []
addDigit(size, '', results)

return results

t = time.clock()
primeSubs = []
flag = False
n=2

while not flag:
masks = getPermutations(n)

print(n, 'digits')
print(len(masks), 'Permutations Found')
print(time.clock() - t)

for mask in masks:
if mask[-1:] != '*' and int(mask[-1:])%2 == 0:
continue
subs = list(map(lambda x: int(mask.replace('*',str(x))), digits))
primeSubs = [x for x in subs if len(str(x))==len(mask) and isPrime(x)]

if len(primeSubs) >= targetCount:
flag = True
break
print('No Primes Found')
print(time.clock() - t)

n+=1

primeSubs.sort()
print('Solved:')
print(primeSubs)

print(time.clock() - t)
import time

النتيجة (الأقل أفضل):

CPython - 51.19908177853776

Iron Python - 26.4938327940

تعليقي:

رغم أن هذا الاختبار هو مجرد "لطش عالماشي" علي أن أعترف أن هذه النتيجة فاجئتني كثيراً. توقعت أولاً أن CPython ستكون أسرع. وثانياً أنه لو كان هناك فرق في الأداء فلن يكون بهذا الحجم. يبدو أن هناك optimization ما يجري مع دوت نت أو أنه يجري عملية ما أسرع من C.

تم تعديل هذه المشاركة بواسطة System Down في 20 مايو 2011 في 22:04

#28

قررت إضافة Jython (بايثون مبني على الجافا) و PyPy (وهو JIT Compiler للبايثون) بنفس البرنامج.

Jython - 112.646858766

PyPy - 6.62125039162

هنا كانت توقعاتي صحيحة. نتيجة Jython هي التي كنت أتوقعها لـIronPython. وPyPy كما كان متوقعاً صاروخي السرعة.

عودةً لموضوع IronPython، قمت بالبحث قليلاً ووجدت هذه المقارنة:

http://ironpython.codeplex.com/wikipage?title=IP20VsCPy25Perf&referringTitle=IronPython%20Performance&ProjectName=ironpython

يبدو أن حدسي كان صحيحاً. IronPython بالفعل أسرع في بعض الأمور وأسوأ في غيرها. لذا قد أحتاج إلى برنامج Benchmark آخر.

1
#29

شكرا للالتفات الى pypy

جربته على الأكواد السابقة، وكانت النتيجة ان pypy اسرع من تطبيق php لكن ابطأ من تطبيق cpp و c على كود الشمري bubble sort

real 0m0.070s

user 0m0.050s

sys 0m0.020s

تعديل2:

لكن يبدو ان pypy ابطأ بكثير من CPython في اختبار الطباعة على stdout في loop. اخذ دقيقتين ونصف بينما CPython اخذ نصف دقيقة تقريبا:

real 2m24.692s

user 2m24.160s

sys 0m0.210s

ربما يجعل هذا pypy اختيار غير موفق لتطبيقات الويب حيث تكثر عمليات الطباعة

قمت نويت ايضا بتحديث ردي السابق

تعديل1: لا املك صلاحية التعديل.. :D

تم تعديل هذه المشاركة بواسطة password123 في 21 مايو 2011 في 02:26

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#30

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

الكود:

اقتباس


import time

t = time.clock()

cutOff = 1000000
primes = [2,3,5,7,11]

# find all primes
for n in range(max(primes)+2,cutOff,2):
flag = True

if n%3 == 0:
flag = False
else:
r = math.floor(math.sqrt(n))
f = 5
while (f<=r):
if n%f==0:
flag = False
break
if n%(f+2)==0:
flag = False
break
f+=6

if flag:
primes.append(n)

print("All primes below",cutOff,"found")
print(time.clock()-t)


maxCount = 1
maxSequence = []
count = len(primes)
while count>1:
flag = False
for i in range(count, len(primes)+1):
sequence = primes[i-count:i]
if sum(sequence)>cutOff:
break
if sum(sequence) in primes:
flag = True
maxSequence = sequence
maxCount = count

if flag:
break
else:
count-=1

print("Max sequence is:")
print(maxSequence)
print("It contains",maxCount,"elements")
print("The sum is",sum(maxSequence))
print(time.clock()-t)

import math

النتيجة (الرقم على اليسار هو وقت إيجاد الأرقام الأولية والرقم على اليمين هو وقت إيجاد المتسلسلة)

Iron Python -	3.11992817107,				740.532437722
CPython - 		6.9382225616855635, 		183.42093718877953
Jython - 		16.441629139,				1273.51406713
PyPy - 			0.371394286647,				498.17371378

التحليل:

الجزء الأول كان حسابياً بحتاً. لذا من المتوقع أن تكون الأرقام الصغرى من نصيب IronPython وPyPy. ولكن نأتي للجزء الثاني الذي يعتمد كثيراً على الـList Slicing وهي عملية يجيد القيام بها CPython. بطء PyPy هنا مثير للاهتمام. هل هذا يعني عدم إكتماله بعد؟

Jython سلحفاة. مللت وأنا أنتظره. لن أستخدمه مرة أخرى.

تم تعديل هذه المشاركة بواسطة System Down في 21 مايو 2011 في 00:24

1
#31

من اجمل المواضيع واكثرها حماسة ... اتمنى من الاخوة الاستمرار ... شكرا password123 و system down وفعلا اتمنى منكم الاستمرار في التجارب.

#32

كل هذه imp للبايثون .. عجيب :-) ،

بالنسبة لحبيبتنا Lua .. سأحاول أن أدخلها في الموضوع لنستعرض عضلاتها مع الكبار ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#33

هذه نتائج اختبار الشمري ( جافا سكربت ) على nodejs

ahmad@ahmad-laptop:~$nodejs  sort.js 
Elapsed Time : 26ms ,,,Sum: 493894 ,Avg: 4938.94 ,Min: 0 ,Max: 999

و هذه نتائج الـphp

ahmad@ahmad-laptop:~$ php sorted.php 
Elapsed Time : 0.345014
Sum: 505506 ,Avg: 505.506 ,Min: 1 ,Max: 1000

المعالج :

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Intel(R) Core(TM)2 Duo CPU     T5250  @ 1.50GHz
stepping	: 13
cpu MHz		: 1000.000
cache size	: 2048 KB

تم تعديل هذه المشاركة بواسطة ahmad123 في 21 مايو 2011 في 02:05

#34

أولاً : معذرة للأخ password ، لأني شطحت بالموضوع مع لغات أخرى ، لكن للمرة هذه فقط :

هذه آخر النتائج التي حصلت عليها ، على نفس المثال Bubble sort ، الموجود في المشاركة رقم 15 - ألا تلاحظون أني أحب Charts

post-42837-008225400 1305933985_thumb.pn

بالنسبة لـ Lua ، النتائج على Lua Demo ( موقع Lua ) وصلت إلى 18ms ، بينما على جهازي 94ms ، بالرغم من أن جهازي جيد جداً من ناحية المواصفات ، بالتالي أشك أن هناك شيء في اعدادات مفسّر Lua يساعد على تسريع التنفيذ وعمل optimization ..

@ أخ أحمد : node.js يستخدم محرك V8 ؟ بالتالي أليس من المفترض أن تكون النتائج متوافقة مع chrome ؟ أم أن chrome لم يستخدم v8 حتى الآن ؟

كود Lua

require("socket")
require ("ex")

--startTime = os.clock()
startTime_m2 = socket.gettime()*1000 -- diff way 

intArray = {}
for i=1,1000 do
    	intArray = math.random(1, 1000)
end
max = -1
min = 10000
avg = 0
sum = 0
for i =1,1000 do
    	sum = sum + intArray
    	if max < intArray then
			max = intArray
		end
    	if min > intArray then
			min = intArray
		end
end		

avg = sum / 1000.0

for j=1,1000 do
    	for i=1,j do
			if intArray[j] > intArray then
				temp = intArray
				intArray = intArray[j]
				intArray[j] = temp
			end
		end
end


--endTime = os.clock()
endTime_m2 =socket.gettime()*1000 -- diff way 
--time =  endTime -  startTime  
time_m2 = endTime_m2 - startTime_m2 -- diff way 


--print(string.format("elapsed time: %.3f\n", time))
print(string.format("elapsed time: %dms \n", time_m2))
print("Sum: " .. sum .. " ,Avg: "  .. avg .. " ,Min: " .. min .. " ,Max: " .. max )

-- print array values
--for i=1,100 do
 --   	print(intArray .. "\n") 
--end
المرفقات
benchamrk _3.PNG

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#35
اقتباس
@ أخ أحمد : node.js يستخدم محرك V8 ؟ بالتالي أليس من المفترض أن تكون النتائج متوافقة مع chrome ؟ أم أن chrome لم يستخدم v8 حتى الآن ؟

صحيح ,يستخدم الـv8 الى الان , لكن تجربته بعيده عن بيئة browser مفيده ايضا

1
#36

الشمري..

اشطح براحتك. انا اميل لتغيير عنوان الموضوع إلى "مقارنات خاطفة بين بعض تطبيقات لغات البرمجة"

كذلك ممكن تضع الكود لbubble sort الذي استخدمته مع lua؟

لانني قمت بتحويله ايضا وشغلته على تطبيق lua5.1

الكود تجده هنا

يعني 22 جزء من الثانية... هذا غريب لان جهازك على الارجح اقوى من جهازي

user@maxtor-laptop:test$ time ./test030.lua 

real 0m0.220s
user 0m0.220s
sys 0m0.000s

قمت بrestart لجهازي والنتائج عندي تغيرت...

lua ابطأ من تطبيق php

اسرع من تطبيق perl لكن بقليل

اسرع من تطبيق CPython

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#37

ممتاز .. أضفت كودي في مشاركة 34 ، نسيت أضيفه ،

ممكن تجربه الآن ( يمكن أن تلاحظ أن هناك طريقتين استخدمتهم لحساب الوقت المستغرق ، يمكن أحدها لن يعمل عندك إذا لم يكن هنا مكتبة مناسبة .. مجرد تخمين )

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#38

الشمري..

كودك اسرع من كودي (ازلت مكتبات الوقت وقسته بالامر time مثل بقية مقارناتي هنا)

كودك في lua اسرع من php

user@maxtor-laptop:test$ time ./test031.lua   // this is shamary's code

real	0m0.116s
user	0m0.120s
sys	0m0.000s
user@maxtor-laptop:test$ time ./test025.php 

real	0m0.140s
user	0m0.130s
sys	0m0.020s
user@maxtor-laptop:test$ time ./test030.lua  // this is my code.. seems my loops were too stupid

real	0m0.218s
user	0m0.230s
sys	0m0.000s

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#39

لدي linux على Virtual machine ، نفس النتائج التي لديك تقريباً .. ( حوالي 120ms )

لكن لازال لدي شك أن " هناك مشكلة في حساب الوقت مع Lua بإستخدام دوال Lua نفسها ،" لأني حاولت أكتب هذا الباتش على ويندوز ، ويظهر أن الوقت المستغرق هو 11ms ؟!!

echo %time%
lua examples\my_example\benchmark.lua
echo %time%

طبعاً نفس الكود مع إزالة الوقت و أوامر الطباعة ، هل هذا الباتش دقيق ؟

عموماً .. كنت أريد أن أعرف مدى سرعة Lua ، لأن سمعتها طيبة ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#40

لماذا لا تستخدم الامر time؟

ارى ان موضوع قياس الزمن معقد بعض الشيء

لان هناك امور كثيرة تحدد الوقت الضائع

واستخدام دالة خاصة باللغة نفسها قد تكون غير حيادية

مثلا لو كانت لدينا لغة اسكربتينج تاخذ وقت كبير للcompile لoptimizations.. وبعدها تشغل الكود

حينها ربما دالة الوقت لن تحسب وقت الكومبايل الذي جرى، وتبدأ الحساب بعدما يشتغل الكود

لكن الامر time يحسبه من منظور الshell عندما كتبت الامر ونهاية بreturn 0، بغض النظر من تفاصيل تطبيق اللغة

لايزال غيردقيق.. لكن يريح البال

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#41

========= بطئ تطبيقات python عند الطباعة على stdout ======

بالنسبة لبطئ CPython في الطباعة على stdout (المعاد توجيهه الى /dev/null)

احدى اسباب البطئ مع print.. الfunction يقوم بحركات دلع

عندما استخدمت sys.stdout.write قل الزمن الى 21 ثانية

عندما استبدلته f.write حيث ان f=os.fdopen(1,etc) وقمت بزيادة الbuffer قل الزمن الى 20 ..

وطبعا كان pypy ابطأ من CPython في جميع الاحوال

لكن لا يزال تطبيق بايثون بطيئا مقارنة بتطبيقات php و perl الذين اخذوا 14 و 12 ثانية فقط مع اعداداتهم الافتراضية

========= regular expressions بسيطة ==========

حاليا معظم عملي على regexp بسيطة.. ولذا هذا الاختبار

سرقت النص من مقالة من wikipedia، والسورس html.. واقوم باختبارين:

* استبدال Jimmy Wales بـ Donation Von Hog، وثم اعادة استبدال النص ليكون كما كان... التجربة معادة مليون مرة

* حساب كم مرة يوجد .*?ales في النص... والتجربة معادة مليون مرة

تجربة استبدال نص:

* perl

real 0m18.134s

user 0m18.120s

sys 0m0.000s

* php

real 0m43.413s

user 0m43.350s

sys 0m0.010s

* pypy

real 1m27.439s

user 1m27.070s

sys 0m0.190s

* python

real 5m27.898s

user 5m26.370s

sys 0m0.400s

تجربة حساب تكرار كلمة معينة:

* perl

real 1m8.005s

user 1m7.800s

sys 0m0.080s

* php

real 4m22.551s

user 4m21.860s

sys 0m0.260s

* python

real 16m4.510s

user16m2.980s

sys 0m0.640s

بطيء جدا... انا لم انتظر.. قمت بقتل البرنامج

قتلته عند الدقيقة 16.. ولو تركته لمضى للمالا نهاية...

حتى pypy لم ينتهي إلى ان قتلته بيدي عند الدقيقة 7

يبدو ان تطبيق perl افضلهم في regular expressions بصفة عامة حسب استخداماتي...

ويبدو ان تطبيق CPython و pypy بطيؤون جدا في هكذا استخدامات.....

سأقوم بتجربة أخرى لاحقا وهي استخدام مكتبات التعامل مع mysql

لانني استخدمها ايضا بكثرة.. حتى اعلم اي تطبيق يقوم بإنجاز المهمة باسرع وقت

والسبب وراء هذا انني في رايي لا أرى اي syntax اصعب بكثير من غيره.. فكلهم سهل التعامل معهم

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

سبب التحديث:

* نسيت وضع re.I في اكواد بايثون (ليكون مثل البقية)

* نسيت اشيل m في اكواد php

* اضفت pypy

* اغدت التجارب والآن النتائج صحيحة

* تحديث الروابط الى codepad

تم تعديل هذه المشاركة بواسطة password123 في 21 مايو 2011 في 20:24

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#42

لست متفاجئاً. perl بدأت حياتها كلغة سكريبت مخصصة للتعامل مع النصوص، وما تزال محافظة على مكانتها في هذه الناحية.

#43

يبدو انه كذلك.. perl متخصصة في النصوص على مايبدو ولم تفقد مكانتها بالرغم من مرور كل هذه السنوات..

وربما سرعة الطباعة على stdout تندرج تحت عمليات النصوص

في الطرف المقابل... قد تكون python متفوقة في العمليات الحسابية بصفة عامة.. ثم perl وثم php..

لكن لا استطيع الجزم لان python كانت الابطأ في اختبار bubble sort

اعدت تجربة الكود المسروق من هنا من مؤلفه Ivan Zahariev.. ونتائجي تقريبا شبيه لناتجه

user@maxtor-laptop:test$ time python test035.py
real	0m31.914s
user	0m31.500s
sys	0m0.380s

user@maxtor-laptop:test$ time perl test035.pl
real	0m39.649s
user	0m39.520s
sys	0m0.110s

user@maxtor-laptop:test$ time php test035.php 
real	1m22.539s
user	1m21.340s
sys	0m1.120s

تطبيقات الويب معظمها تتطلب طباعة + database

الطباعة على stdout مفيد لتطبيقات CGI..

لكن مع mod_php وmod_perl و mod_python فليس شرطا ان الطباعة تذهب لstdout queue

لهذا السبب سأعيد التجارب مع mod_xxxxx في apache بالنسبة للطباعة

وثم اجرب اوامر شائعة على mysql.. وبعدها ساحصل على فكرة معقولة حول افضل تطبيق للويب حسب استخداماتي

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

مواضيع مشابهة