password123

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

43 ردود في هذا الموضوع

انت على 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بناءً على القاعدة الذهبية أنه لا يوجد شئ اسمه "لغة أسرع من لغة" بل "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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

قررت إضافة 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا للالتفات الى 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حسناً هذا اختبار أكثر شمولية. مسألة 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
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

[email protected]:~$nodejs  sort.js 
Elapsed Time : 26ms ,,,Sum: 493894 ,Avg: 4938.94 ,Min: 0 ,Max: 999

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

[email protected]:~$ 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أولاً : معذرة للأخ 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[i] = math.random(1, 1000)
end
max = -1
min = 10000
avg = 0
sum = 0
for i =1,1000 do
sum = sum + intArray[i]
if max < intArray[i] then
max = intArray[i]
end
if min > intArray[i] then
min = intArray[i]
end
end

avg = sum / 1000.0

for j=1,1000 do
for i=1,j do
if intArray[j] > intArray[i] then
temp = intArray[i]
intArray[i] = 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[i] .. "\n")
--end

0

شارك هذا الرد


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

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الشمري..

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

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

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

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

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

[email protected]:test$ time ./test030.lua 

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الشمري..

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

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

[email protected]:test$ time ./test031.lua   // this is shamary's code

real 0m0.116s
user 0m0.120s
sys 0m0.000s
[email protected]:test$ time ./test025.php

real 0m0.140s
user 0m0.130s
sys 0m0.020s
[email protected]:test$ time ./test030.lua // this is my code.. seems my loops were too stupid

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

========= بطئ تطبيقات 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

[email protected]:test$ time python test035.py
real 0m31.914s
user 0m31.500s
sys 0m0.380s

[email protected]:test$ time perl test035.pl
real 0m39.649s
user 0m39.520s
sys 0m0.110s

[email protected]: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.. وبعدها ساحصل على فكرة معقولة حول افضل تطبيق للويب حسب استخداماتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .