اذهب إلى المحتوى

السؤال

نشر

لقد سمعت أنه بالنسبة لـ "المصفوفات الكبيرة" يجب أن أستخدم Numpy بدلاً من قوائم Python ، لأسباب تتعلق بالأداء وقابلية التوسع. الشيء هو أنني أعرف قوائم بايثون ويبدو أنها تعمل بدون مشكلة بالنسبة لي.
ماذا ستكون الفوائد إذا انتقلت إلى Numpy؟ وهل أحتاج إلى إمكانيات أكبر في حسوبي لكي أتعامل مع Numpy؟ وكيف أقيس سرعة العمليات التي تتم من خلال numpy؟

Recommended Posts

  • 0
نشر (معدل)

أول فرق يكمن بالحجم التخزيني، فمصفوفات نمباي تخزن البيانات بشكل أكثر فعالية وتستهلك عدد أقل من البايتات لكل عنصر:

import numpy as np
import sys
# إنشاء قائمة بألفي عنصر
l= range(2000)
# حجم كل عنصر من عناصر القائمة بالبايت
print("Size of each element : ",sys.getsizeof(l),"bytes")
# حجم كامل القائمة
print("Size of the whole list : ",sys.getsizeof(l)*len(l),"bytes")
# إنشاء مصفوفة نمباي بألفي عنصر
D= np.arange(2000)
# حجم كل عنصر بالمصفوفة
print("Size of each element: ",D.itemsize,"bytes")
# حجم كامل المصفوفة
print("Size of the whole array : ",D.size*D.itemsize,"bytes")
'''
Size of each element :  48 bytes
Size of the whole list :  96000 bytes
Size of each element:  4 bytes
Size of the whole array :  8000 bytes
'''

الفرق الثاني بزمن التنفيذ حيث أن استخدام مصفوفات نمباي يعد أكثر فعالية في زمن التنفيذ، في المثال التالي ستعرض الفرق بزمن تنفيذ العمليات عندما نستخدم مصفوفات نمباي و القوائم:

import numpy as np
import time
# تعريف قائمتين
l1 = range (200000)
l2 = range(200000)
# تعريف مصفوفتين
arr1 = np.arange(2000000)
arr2 = np.arange(2000000)
# حساب الزمن اللازم لمضاعفة عناصر القائمة
start = time.time()
r = [(x * y) for x, y in zip(l1, l2)]
print("Time when we use lists :",(time.time() - start),"sec")
#حساب الزمن اللازم لمضاعفة عناصر المصفوفة  
start = time.time()
r = arr1 * arr2
print("Time when we use numpy arrays :",(time.time() - start),"sec")
'''
Time when we use lists : 0.04999589920043945 sec
Time when we use numpy arrays : 0.0069963932037353516 sec
'''

لذا فهي أكثر كفاءة في التخزين والزمن اللازم لإجراء العمليات عليها، ويعود السبب الأساسي لذلك في طريقة تخزين العناصر في نمباي (تخزن العناصر بشكل متجاور على عكس القوائم)

تم التعديل في بواسطة Ali Haidar Ahmad
  • 1
نشر (معدل)

بالإضافة إلى ما ذكره @Ali Haidar Ahmad في إجابته يمكننا أيضاً أن نقول هنالك فوارق أخرى بين numpy arrays & lists:

  • المصفوفات لها طول ثابت على عكس القوائم، و في حالة الإضافة للمصفوفة يتم مسح الأصلية و إنشاء واحدة أخرى بنفس الطول + 1.
  • العناصر في القوائم يمكن أن تكون من أنواع مختلفة و لكن العناصر في المصفوفات تكون من نفس النوع، يمكن أن تحتوي عناصر مختلفة لكن لن يتم تنفيذ العمليات الحسابية مثلاً في هذه الحالة.
  • يمكن للمصفوفات التعامل مع العمليات الحسابية و الإحصائية، و العمليات الجبرية و البحث على البيانات الضخمة بصورة أكثر كفاءة و أقل كود.
from numpy import arange
from timeit import Timer
#تحديد عدد البيانات المدخلة 
Nelements = 10000
#إنشاء قائمة و مصفوفة بنفس الطول
x = arange(Nelements)
y = range(Nelements)
#تعريف دالة الجمع لإستخدامها في قياس المدة الزمنية
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
#طباعة الزمن الناتج من تنفيذ العملية
print("numpy: %.3e" % (t_numpy.timeit(Nelements)/Nelements,))
print("list:  %.3e" % (t_list.timeit(Nelements)/Nelements,))

البرنامج السابق عبارة عن نموذج يوضح الفرق في سرعة التعامل مع كل من المصفوفات و القوائم التي تصل إلى فرق 10 أضعاف السرعة للمصفوفات مقابل القوائم.

numpy: 9.865e-06
list:  1.839e-04

 

 

 

 

تم التعديل في بواسطة Reem Elmahdi
إضافة ناتج التنفيذ
  • 0
نشر

بالإضافة لسرعة تنفيذ العمليات المختلفة والكفاءة العالية في التخزين ل numby عن القوائم في python فإن ال numby توفر عليك بعض الأعمال التي ربما تحتاج لمزيد من العمل لتنفيذها من خلال قوائم python مثل

  • الجمع على طول المحور المطلوب
    numpy.sum(arr, axis, dtype, out)

      

  • تحويل البيانات من الملفات إلى مصفوفة مباشرة

    x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

      

وهناك أيضاً العديد من المكتبات التي تعمل مع أو تعتمد على ال numby مثل مكتبات ال visualization 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...