عشرة أسباب تجعل من بايثون أداة رائعة للأبحاث وأسباب أخرى تُقلل من روعتها

نشره Fahad في

ما ستقرؤونه هنا هو تجربتي الشخصية مع بايثون، و لأن هذه التجربة كانت إيجابية فإن ما أكتبه هنا ما هو إلا محاولة و بلا حرج لتعزيز استخدام بايثون في البحث العلمي و تطويره . أربع سنين مضت على تركي لماتلاب MATLAB لصالح بايثون كلغتي الأساسية لمشاريع بحوث البرمجة، هذه المقالة تُوضح مدى استمتاعي بهذه التجربة .

كما سأشرح في الأقسام القادمة، مدى تنوع وجودة الخصائص التي أفسدتني بها بايثون، حتى في المهمات البرمجية الصغيرة، أصبحت الآن أعتمد على تراكيب البيانات الهائلة لدى بايثون ، تصنيفاتها، وظائفها المتداخلة، نص النداء المرن و المكتبة القياسية المضمنة( كبالوعة المطبخ) و أيضاً المكتبات العلمية العظيمة و التوثيق المميز.

للتوضيح، أنا لا أروّج لاستخدام بايثون لوحدها كبيئة مثالية في البرمجة العلمية ، أنا أروج للغة بايثون مع ثلة من المكتبات المستقلة الناضجة مفتوحة المصدر ، و بالتحديد Numpy/Scipy للعمليات العددية ، و Cython  للتحسينات في أدنى مستوى ، و IPython  للعمل التفاعلي ، و MatPlotLib للرسومات ، لاحقاً سأشرح ما سبق سرده بالإضافة إلى مكتبات أخرى بتفصيل أكثر، حيث أنني ذكرتهم الآن حتى أتحدث عنهم لاحقا ضمن هذه المقالة.

بوجود هذه المكتبات، صارت الخصائص الموجودة في ماتلاب التي تسمح لمستخدمها  بكتابة نص برمجي بسرعة بمجال تعليم الآلة و الذكاء الاصطناعي- مجالي البحثيّ الأساسي- جزء صغير من ما هو موجود في بايثون. بعد قضاء يوم في تعلم بايثون، مازال بإمكاني استخدام كل حيل المصفوفات التي تعلمتها في الماتلاب في بيئة بايثون بل و تحديد تراكيب بيانات أقوى و تصميم أنماط حسب الحاجة.

تصميم اللغة الكلي

كنت أؤمن بأن اللغة المثالية للبحوث هي اللغة التي تتيح الترجمة المباشرة من خربشات المفكرة إلى نص برمجي، بشكل عام هذا إيمان منطقي، لأن كثرة العقبات بين صناعة الأفكار و تطبيقها تبطئ عملية البحث، بكلمات أخرى: كلما قلّ الوقت اللازم في التفكير بخصوص البرمجة كلما كان أفضل، أما الآن أنا أؤمن بأن هذا الإيمان كان خاطئاً

يُركز تصميم لغة الماتلاب على المصفوفات وعمليات الجبر الخطية و لتحويل مثل هذه العمليات إلى عملية خطية هو في الحقيقة سهل و غير مسبوق، لكن الذهاب إلى أبعد من ذلك و يجعل العملية كتدريب على الإحباط.

لغة R  جميلة لتحليل البيانات تفاعلياً و مكتباتها المفتوحة لحزم الإحصائيات رائعة بحق ، ولكن تصميم اللغة غير طبيعي ومن الممكن أن يصاب المرء بالجنون في حالة استخدامها في مشاريع كبيرة. وبينما لغة Mathematica مثالية للعمل التفاعلي مع الرياضيات الخالصة فقط، إلا أنها لم تصمم بغرض البرمجة بشكل عام.

المشكلة مع توجه البحث عن "المطابق الأمثل" هو أنك تخسر بذلك الشمولية بسرعة. وحين يكون مجال تصميم اللغة ضيق جدا ستضطر لتصل بتطبيق واحد فقط إلى المثالية على حساب أن يكون لديك أكثر من تطبيق جيد. لهذا توفر الجامعات برامج دراسية تُعنى بتصميم لغات البرمجة (عملية تحديد إيجابيات و سلبيات عدة تصاميم مختلفة بشكل صائب هو أمر فائق الصعوبة). الاستخدام الواسع لبايثون في كل شيء ابتداءا من إدارة الأنظمة و تصميم المواقع إلى طحن الأعداد عدديا يُظهر أنها لغة ناجحة جدا بكل تأكيد. في الحقيقة كنت شاهدا عن كثب كيف أن تطوير المهارات في لغة R يؤدي إلى تطوير مهارات التفاعل مع البيانات، و تطوير المهارات في ماتلاب يؤدي إلى تطوير مهارات كتابة سكربتات سريعة (رديئة) ،  وتطوير المهارات في بايثون يؤدي إلى تطوير مهارة البرمجة بشكل الحقيقي.

عملياً، في مجال عملي، الجانب السلبي هو أن بعض عمليات المصفوفات التي تمثل باستخدام بنى نحوية في ماتلاب تصبح نداءات لوظائف (على سبيل المثال x = solve(A, y) عوضا عن x = A \ y ). وفي مقابل هذا الإسهاب- والذي لا أجده مشكل- يجد الواحد هذه الوظائف مرنة جدا و أنها لغة واقعية ابتداءا من الأنظمة الأوتوماتيكية حتى البحث العلمي. لا يحتاج المبرمج لتبديل إلى لغة أخرى إذا ما اضطر لكتابة نص برمجي غير علمي كما أن هذه اللغة تقدم منفذا سهلا لمكتبات أخرى( مثل قواعد البيانات) للبحث العلمي.

بالإضافة إلى ذلك، تسمح بايثون لمستخدمها بالنفوذ السهل إلى نماذج تصميم البرمجة الشيئية و البرمجة الإجرائية. فكما أن وجود بعض المشكلات المختلفة يتطلب طرقا مختلفة لحلها فهناك أيضا مشكلات مختلفة تتطلب طرق برمجية مختلفة. لا يوجد هناك أي شك بأن النظام الخطي الإجرائي هو نظام معتاد عليه لحل مشكلات علمية عديدة، لكن النظام الشيئي المبني على منظومات تحتوي على وظائف داخلية و تصرفات خارجية هو الحل المثالي للبعض. لهذا فإن الأصناف classes في بايثون هي مكتملة الخصائص و عملية. البرمجة الوظائفية، والتي تُبنى على قوة العدادات و الوظائف كمتغيرات تجعل الكثير من الحلول البرمجية موجزة و بديهية بكل عبقرية في بايثون، حيث يمكن تمرير كل شيء كعنصر، مثل الوظائف و تعريفات الأصناف و أيضا الوحدات. العدادات Iterators هي أحد أهم مكونات اللغات البرمجية و بايثون تأتي بمكتبة متكاملة للعدادات ، رغم أنها لا تذهب بعيدا في العدادات مثل النماذج الرائدة فيه مثل جافا و هاسكل، لكنها تسمح باستخدام أدوات عملية من هذه النماذج، هذه الخصائص أجمع تجعل من بايثون لغة عملية و حلالة للمشاكل وهذا أحد مفاتيح شهرتها.

قابلية القراءة

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

هذه القدرة لها العديد من الفوائد الإيجابية، يقول مصمم بايثون الأساسيGuido van Rossum :

هذا التركيز على القدرة القرائية لم يحدث بمحض الصدفة، كلغة برمجة شيئية، بايثون تهدف إلى تشجيع إنشاء نص برمجي يمكن إعادة استخدامه، حتى لو كتبنا توثيق كامل في كل وقت ،فإن النص البرمجي سيعاد استخدامه بصعوبة إذا لم يُقرأ بسهولة. العديد من خصائص بايثون ، بالإضافة إلى استخدام الإزاحة الخاصة بها، تجعل النص البرمجي الخاص بها يُقرأ بفاعلية أكبر. [1]

بالإضافة إلى ذلك ، وجدت أن هذه الميزة مشجعة للتعاون وليس فقط مسهلة للتشارك في مشاريع بايثون مفتوحة المصدر. فإذا كان بإمكانك مناقشة نصك البرمجي بسهولة مع الآخرين في مكتبك، ستكون النتيجة أفضل و سيكون المبرمجون أفضل.

كمثالين على هذا الأمر ، اقرأ النص البرمجي التالي:

def classify(values, boundary=0):
"Classifies values as being below (False) or above (True) a boundary."
return [(True if v > boundary else False) for v in values]

# Call the above function
classify(my_values, boundary=0.5)

دعوني أشرح لكم النقاط الثلاثة التي تعرض لها هذا النص البرمجي أولا: أنها وظيفة مكتملة بنفسها احتاجت إلى ثلاثة أسطر فقط لتعريفها مع التوثيق المرافق لها، ثانيا: القيمة الافتراضية للحد معرّفة بطريقة سهلة القراءة بجنون ( نعم، هذا الأمر يظهر في حال استخدام “Sphinx” لإنشاء توثيق آلي)، ثالثا: البناء النحوي لمعالجة القائمة list مصمم ليكون قابل للقراءة، حتى لو لم تكن معتاد على قراءة نصوص بايثون البرمجية ، فإنه من السهل تحليل هذا النص- ستنشئ وتعيد قائمة جديدة عائدة بقيمة True إذا كانت قيمة v هي أعلى من الحد boundary و بقيمة False لبقية الأحوال. أخيرا ، حين مناداة الوظائف ، تسمح بايثون بالمعطيات المسماة named arguments- هذا يشجع الوضوح كما يقلل ثغرات المتابعة bookkeeping الغبية، تحديدا إذا كانت هذه الوظائف تتطلب أكثر من معطى.

اسمحوا لي بمقارنة هذه الخصائص بما هو موجود في ماتلاب، حيث أنه في ماتلاب يتم حفظ الوظائف المتغيرة العامة في ملفات منفصلة، غير مشجعة على استخدام الوظائف القصيرة –وعمليا- تشجع عمليات القص و اللصق في البرمجة، والتي هي لعنة التنقيح الأكواد. كذلك المعطيات الافتراضية تسبب الكثير من الألم ؛ حيث أنها تحتاج إلى برمجة مشروطة لتحديد المعطيات غير المحددة. أخيرا، تحديد المعطيات بالاسم حين المناداة ليس بخيار مطروح- مع أن هناك بناء مشهور ولكنه افتراضي يغير بين الأسماء و القيم في قائمة المعطيات يسمح بذلك إلى حد ما.

 

الموازنة بين البرمجة المستوى العالي و المستوى المنخفض

سهولة الموازنة بين البرمجة ذات المستوى العالي و المستوى المنخفض هي نقطة قوة تُحسب لصالح بايثون، تعتبر نصوص بايثون البرمجية نصوص ذات مستوى عالي إلى حد معقول ، سمعت أنه حال كتابة خوازميات متشابهة بالمتوسط يمكنك أن تكتب ستة أسطر في سي/سي++ لكل سطر مقابل في البايثون. على أية حال، كما هو في أغلب لغات البرمجة عالية المستوى ، أنت بالغالب ستضحي بسرعة تنفيذ نصك البرمجي لصالح سرعة البرمجة.

المقاربة المعقولة لهذا الأمر هو التعامل مع العناصر ذات المستوى العالي- مثل المصفوفات و القوائم- و تحسين العمليات المُنفذة على هذه العناصر لجعل البرمجة أسرع بشكل مقبول، هذه هي طريقة ماتلاب وهي أحد مفاتيح نجاحه، كما أنها طبيعية في بايثون، في هذا السياق تعني عملية تسريع البرمجة جعل خوارزمياتك كمتجهات تعمل مع مصفوفات عددية عوضا عن أرقام فردية، هذا سيقلل الضغط المُحمل على اللغة إذا ما كانت عمليات المصفوفات محسّنة.

التجريد Abstraction مثل هذا ضروري جدا للبرمجة العلمية، والتركيز على العمليات ذات المستوى العالي و المنفذة على أنواع بيانات ذات مستوى عالي يؤدي بشكل عام إلى اكتساب سرعة برمجة كبيرة و دقيقة. يسمح نظام بايثون لتوسيع الأنواع بسهولة للمكتبات لتُصمم أنواع جديدة بشكل متكامل، مصفوفة ” Numpy” تعتبر مثال رائع على هذا الأمر.

على أية حال، التجريدات المتوفرة ليست كافية دائما حينما تطور خوارزميات جديدة أو حين تبرمج أفكارا جديدة، كمثال جعل النص البرمجي كمتجه باستخدام المصفوفات هو أمر قوي لكنه محدود، في حالات عديدة تحتاج العمليات إلى حلقات ، و وظائف عودية وغيرها من هياكل البرمجة التي تعمل بشكل جيد مع النص البرمجي المحسن و المنشئ بلغة الآلة و لكنها ليس باللغات المفسرة الشائعة، المتغيرات - كما هو في الحال في كثير من اللغات المفسرة - لا تكتب بشكل ثابت و لا يستطيع النص البرمجي تنفيذه بلغة الآلة. في السياق العلمي ، سايثون Cython توفر التوازن المثالي بين الأمرين عبر توفيرهما معا.

سايثون Cython تعمل أولا بترجمة نص بايثون البرمجي إلى ما يعادله في لغة سي حيث يُنفذ نص بايثون المعدل هذا عبر واجهة برمجة التطبيقات لبايثون سي، و من ثم يستخدم مترجم لغة سي لإنشاء مكتبة مشتركة يمكن تحميلها كوحدة بايثون. بشكل عام، هذه الوحدة تطابق بخصائصها لوحدة بايثون الأصلية و تتفوق عليها بالسرعة هامشيا. من إيجابيات استخدام سايثون على كل حال، أنها تسمح بكتابة المتغيرات بشكل ثابت، مثال ( cdef int i ) تُعرّف i كعدد صحيح، هذه الخاصية تزيد من السرعة بشكل فائق لأن المتغيرات المكتوبة تُعامل الآن في بايثون باستخدام متغيرات من مستويات أدنى عوضا عن متغيرات بايثون نفسها. مع هذه الفروق سيكون نص بايثون البرمجي الخاص بك بسرعة نص سي البرمجي من دون الحاجة إلى معرفة كبيرة بلغة الأخيرة.
عملياً، قليل من تعريفات الأنواع ستعطيك سرعة عظيمة، كمثال، اعتبر أن لديك هذا النص البرمجي:

def foo(A):
for i in range(A.shape[0]):
for j in range(A.shape[1]):
A[i,j] += i*j

حيث A هي مصفوفة NumPy من بعدين. هذا النص البرمجي يستخدم حلقات مفسرة ولهذا تعمل ببطء شديد، على أية حال، فلنضف معلومات النوع ولنستخدم سايثون:

def cyfoo(ndarray[double, ndim=2] A):
cdef size_t i, j

for i in range(A.shape[0]):
for j in range(A.shape[1]):
A[i,j] += i*j

تترجم سايثون عمليات بايثون الضرورية إلى نداءات لواجهة سي عبر بايثون Python C-API و لكن الحلقات و الفهرسة تتحول إلى نص سي منخفض المستوى، لكل مصفوفة بحجم ١٠٠٠×١٠٠٠ على جهازي ذو 2.4 قيقا هرتز ، بايثون تستهلك 1.67 ثانية بينما نسخة سايثون تستهلك فقط 3.67 ملي-ثانية ( النسخة المتجهة من النص البرمجي السابق باستخدام الضرب الخارجي تستهلك 15.1 ملي-ثانية)

كقاعدة عامة يستهلك برنامجك ٨٠٪ من وقته لتنفيذ ٢٠٪ من نصه البرمجي ، فلهذا كاستراتيجية جيدة لنص برمجي فعال هي كتابة كل شيء، ثم تحليل النص البرمجي ، ومن ثم تحسين الأجزاء التي تحتاج إلى تحسين.

محللات بايثون profilers رائعة ، وسايثون تسمح لك بتحسين نصك البرمجي بأقل جهد مبذول.

إمكانية التبادل في اللغة

كعرض جانبي لعمومية اللغة هو أن بايثون لاصق ممتاز للغات البرمجة المختلفة ، حيث يستطيع الواحد مناداة وظائف ماتلاب من بايثون( عبر محرك ماتلاب) باستخدام MLabWrap ؛ مما يسهل عملية الانتقال من ماتلاب إلى بايثون، هل تحتاج إلى استخدام حزمة الانحدار الخطي من لغة R ؟ RPy سيضعها على أطراف أصابعك ، هل تملك نص فروترنFORTRAN سريع لخوارزمية عددية معينة؟ F2py سيقوم بتغليف ذاك النص بدون جهد ، هل تملك مكتبات سي وسي++ عامة وتريد مناداتها؟ سيقوم بذلك بدون أي جهد.

تريد استخدام مكتبات سي او سي++؟ Ctypes ، أو Cython، أوSWI هي ثلاثة طرق سهلة لتخاطب معها ( سايثون هي تفضيلي الشخصي). الآن لو أن كل هذا يمشي بالاتجاهين...

نظام التوثيق

ببراعة تدمج بايثون توثيق الوحدة، والصنف ، والوظيفة مباشرة في اللغة نفسها. في الحقيقة هناك مستويين من التعليقات - التعليقات مستوى البرمجة (تبدأ ب #) التي يتجاهلها المترجم، والتعليقات الوثائقية التي تحديد من قبل doc string بعد الدالة أو الوظيفة. نصوص الوثائق هذه تضيف الوسوم إلى الوظائف التي يمكن الوصول إليها من قبل أي شخص باستخدام منصة بايثون التفاعلية أو عن طريق مولدات الوثائق التلقائي.

جمال نظام بايثون يصبح واضحا عند استخدام سفنكس Sphinx - نظام توليد الوثائق التي بنيت أصلا لتوثيق لغة بايثون-. للسماح بمرونة كافية للعرض ، تتيح توجيهات reStructuredText لغة ترميزية سهلة و مقروءة ، والتي أصبحت تستخدم على نطاق واسع في وثائق التعليمات البرمجية.

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

هناك خاصية تساعدك في البرمجة العلمية هي قابلية استخدام عمليات لا-تكس و القيام بتنفيذ رسم هندسي نقطي داخل وثائق النص البرمجي، كمثال مكنك الكتابة كالتالي:

.. math:: \Gamma(z) = \int_0^\infty x^{z-1}e^{-x}\,dx

سيظهر في صفحة الويب هكذا



تضمين النقاط أمر سهل، النص التالي:

.. plot::

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,2, 1000)

plt.figure()
plt.plot(x, np.sqrt(x), label = r"Skiing: $\sqrt{x}$")
plt.plot(x, x**2, label = r"Snowboarding: $x^2$")
plt.title("Learning Curves for Snowboarding and Skiing")
plt.xlabel("Time") ; plt.ylabel("Skill")
plt.legend(loc='upper left')
plt.show()

يعطي

(Source code, png, hires.png, pdf)



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

نظام الوحدات الهرمية

تستخدم بايثون البرمجة الوحدية، نظام شائع بطبيعته يرتب الوظائف و الدول داخل مساحات اسمية namespace . كل ملف بايثون يعرف وحدة. الوظائف والأصناف وا لمتغيرات المعرفة أو مجلوبة داخل الملف ستظهر في مساحة الاسم لهذه الوحدة، استيراد الوحدة يمكن أن ينشئ قاموسا محليا يحمل عناصر هذه الوحدة أو يسحب بعض عناصر هذه الوحدة إلى المساحة الاسمية.

كمثال import hashlib تربط hashlib.md5 بوظيفة التحقق من md5 التابعة لhashlib ، بالتناوب from hashlib import md5 تربط md5 بهذه الوظيفة ، هذا يساعد برمجة المساحات الاسمية لتتبع نظاميا هرميا.

في البرمجة يعرف ملف في بايثون الوحدة، و شبيه بذلك سيعامل المسار المحتوي على ملف بايثون __init__.py بنفس الطريقة ، حيث يمكن أن تعرف الملفات الموجودة في المسار وحدات فرعية، وهكذا سيترتب النص البرمجي بهيكلة هرمية للمبرمج و للمستخدم.

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

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

 

هيكلة البيانات

البرمجة الجيدة تحتاج إلى امتلاك واستخدام هيكلة بيانات صحيحة لخوارزميتك، هذا الأمر لا يعار له الاهتمام الكبير في البرمجة البحثية، في حين أن نصوص البرمجية على شاكلة إثبات المبدأ لا تحتاج بالعادة إلي هيكلة بيانات محسنة إلا أنها تسبب مشاكل عند وضعها في الإنتاج، هذا بالغالب - مع ندرة التحدث عنه- يقلل من توسع الكثير من النصوص البرمجية المتوفرة حاليا، بالإضافة إلى أن هكذا خصائص ليست طبيعية في تصميم اللغة ، فإن المبرمجين غالبا ما يتجنبونها و يفشلون في تعلم أنماط تصميم جيدة.

تملك بايثون قوائم، وجداول ،و مجموعات ، وقواميس، ونصوص، وصفوف الخيوط الآمنة و العديد من الأنواع المبنية داخلها. تحمل القوائم عناصر بيانات عشوائية التي يمكن أن تُصنف و تشرّح و تجمّع و تستخدم ككومات، والمجموعات تحمل عناصر فريدة و غير مرتبة، والقواميسDictionaries توصّل بين المفاتيح الفريدة لأي شيء و أيضا تكون قواعد اللغة الأساسية.

الأكوام متوفرة كعمليات على أول القائمة( تشابه أكوام السي++) . أضف نمبيNumPy و ستحصل على هيكل لمصفوفة متعددة الأبعاد والتي تدعم التحسين و عملية في النشر و عمليات المصفوفات. أضف ساي-باي SciPy و ستحصل على مصفوفات متناثرة، وإشجار كي دي، وعناصر الصور ، وسلسلة الوقت و المزيد.

المكتبات المتوفرة

تحتوي بايثون على مكتبة رائعة محزّمة بداخلها، فلسفتها تعتمد على إضافة البطاريات batteries-included ، وتوزيعة بايثون الأساسية تأتي بقواعد بيانات مدمجة و بأنواع بيانات ثابتة و مختلفة و روتينات الواجهات لأنظمة التشغيل و وواجهات الويب و البريد الإلكتروني و أدوات الشبكات، و أدوات ضغط البيانات و التشفير و دعم الاكس ام ال و التعبيرات الاعتيادية و اختبار الوحدات و ثنائية النواة والعديد من المميزات، باختصار، إذا أردت أن أرتاح من برمجة عمليات المصفوفات وأقوم بجعل عملية في النظام تؤدى بشكل آلي ؛ فإني لا أحتاج إلي تغيير اللغة.

بالإضافة إلى وجود مكتبات واسعة تدعم الوظائف المطلوبة للبرمجة العلمية، ما سيأتي قائمة أستخدمها غالبا و أجدها مختبرة بشكل جيد و لها فاعلية :

NumPy/SciPy

هذا الزوج من المكتبات يدعم القوائم و المصفوفات و الجبر الخطي و التحسينات العددية و إنتاج الأعداد بعشوائية و وظائف الإحصائيات و هياكل مختلفة للمعادلات و تحويلات فورييه و معالجة الإشارات و الصور و نثر و تغليف القوائم و حساب المكانية و العديد من الوظائف و المعادلات الرياضية، باتحادهما يغطيان معظم وظائف ماتلاب الأساسية و أجزاء من الأدوات الإضافية و أيضا تدعم القراءة والكتابة لملفات الماتلاب، بالإضافة إلي ذلك يحتويان الآن على توثيق رائع محدث بشكل قوي عبر السنين الماضية كما أنها شائعة بين وسط نشط جدا.

IPython:

من أفضل الأشياء في بايثون هو اي-بايثون، وهي صدفة محسنة و تفاعلية تقوم بعملية التدقيق و تصنيف النص البرمجي و الرسم الهندسي. تدعم ميزة الإكمال عند ضغط زر tab للعناصر، وميزة التدقيق المدمج، وميزة إيجاد الوحدة و الكثير من الوظائف، بالإضافة إلى أنها بشكل أساسي تقوم بكل ما يمكنك توقعه من واجهة برمجية عبر سطر الأوامر.

Cython:

ذكرت سابقا، سايثون هي طريقة غير مؤلمة لإضافة أجزاء من نصوص برمجية معدلة و محسنة لبرنامج بايثون أكبر.

SQLAlchemy:

تجعل SQLAlchemy الاستفادة من قوة قواعد البيانات أمراً بالغ السهولة و بديهي ، وهي بالأساس التفاف حول قاعدة بيانات SQL و تبني أنت الاستعلامات باستخدام معاملات بديهية، ثم تبني هي نص اس كيو ال و تنفذه على قاعدة البيانات و تعيد لك مؤشرا للنتيجة، , ومع قاعدة بيانات sqlite اس كيوليت- المدمج أساسا في مكتبة بايثون- سيتمكن الباحث من الاستفادة من قوة قواعد البيانات لأجل أغراض علمية بسهولة شديدة. وأيضا إذا أخبرت اس كيوليت بأن تبني قاعدة بياناتها في الذاكرة ، ستحصل على هيكل بيانات أقوى. و استلهما من كاركتير xkcd ، فإن SQLAlchemy تجعل من قواعد البيانات أمراً ممتعا مرة أخرى.

PyTables:

إنها طريقة رائعة للتعامل مع كمية كبيرة من البيانات بطريقة ذات فاعلية و مرتبة و معتمدة ، حيث أنها تحسن من المصادر ، وتحول بشكل آلي البيانات من القرص و الذاكرة حسب ما يتطلبه الأمر، كما أنها تدعم أيضا الضغط الفوري و تعمل بسلاسة مع قوائم نمبيNumPy.

PyQt:

لكتابة واجهة رسومية للمستخدم عبر السي ++،فإنه لمن الصعب التغلب على كيو-تي Qt (شخصيا أنصح بها) ، PyQt تجلب سهولة الكيو-تي إلى بايثون، وأنا بالفعل أقصد هذه السهولة، لقد بنيت باستخدام مصمم كيو-تي واجهة رسومية لتطبيق علمي معقدة نوعا ما فقط عبر أسطر قليلة من النص البرمجي المخصص، كل الأمر تطلب مني أياماً معدودة فقط ، هذا النص البرمجي يعمل على أكثر من نظام تشغيلي ، مثل لينكس و ماك او-اس و ويندوز . إذا احتجت إلى تطوير واجهة أمامية لإطار بياناتك ولا تأبه لأمر الرخصة ( GPL ل PyQt و LGPL لمكتبة كيو-تي.) ، فمن خلال تجربتي فهذه أسهل طريقة لفعل ذلك.

TreeDict:

بدون تخطيط واضح، غالبا ما تكون المشاريع البحثية الكبيرة معرضة للقانون الثاني للديناميكا الحرارية: بمرور الوقت، ترتيب العوامل و البيانات و النتائج تصبح عشوائية بشكل متزايد. تري-دكت TreeDict هو هيكل بيانات لبايثون قمت بتصميمه لمحاربة هذه المشكلة، إنه يخزن المجموعات الهرمية للعوامل و المتغيرات و البيانات و يدعم النسخ و الربط و التجزئة و عمليات أخرى تنفذ على الهياكل الشجرية. هذا التنظيم الهرمي يدعم التنظيم الذي يتابع الانقسامات المفاهيمية التي تحدث في البرنامج ، كمثال: ملف واحد يمكن أن يُعرف كل المتغيرات بينما يعكس بناء باقي النص البرمجي.

Sage:

سيج لا ينتمي بالضرورة إلى هذه القائمة ، لأنه يحزم كل الحزمات المذكورة سابقا في إطار عمل واحد للبحوث الرياضية، إنه يهدف ليصبح الحل الكامل للبرمجة العلمية، كما إنه يتعاون مع المئات من المكتبات العلمية مفتوحة المصدر. إنه يبنيها بطريقة مفهوم كتاب الملاحظات الذي يساعد على شحذ التفكير و يساعد على تنظيم البحث العام. كما أنه يحتوي واجهة على الإنترنت لتجربتها . كحزمة متكاملة، أنا أوصي المبتدئين للبرمجة العلمية ببايثون لتجربة سيج أولا، إنه يعمل عملا جيدا في توحيد الأدوات المتوفرة في عرض ثابت.

توزيعة بايثونEnthought :

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

إطار الاختبار

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

الجانب السيئ

لا توجد مقالة مقنعة بالكامل بدون عرض صريح للجوانب السيئة، وبالفعل هنالك العديد منها للذكر، في الحقيقة العديد من نقاشاتي تتضمن عرض لجانب سيء ، مع خيارات عديدة في متناول اليد، من أين يبدأ الشخص؟ أن تتخذ قرارا فاصلا في كل نقطة يؤدي أحيانا إلى شلل في الإنتاجية، في معظم التطبيقات، أليس استخدام لغة جامدة ولكنها صامدة كماتلاب يعتبر خيارا أفضل؟

بينما يمكن للشخص أن يستخدم نصوص برمجية اعتيادية في بايثون و لكنني أميل للموافقة بهذا الشأن ، على الأقل إلى حد معين، على أية حال، الحال هنا ليس سيئا بشكل عام و على العكس، نستطيع مقارنته بين تعلم التزلج على الجليد وتعلم التزلج على الثلج، يمكن للشخص أن يمر بأيام مريعة في بداية تعلمه التزلج على الثلج بينما يمكنه تعلم التزلج ومبادئها بشكل أسرع. على كل حال، بعد مرور بضعة أسابيع و بينما المتزلج على الثلج يصبح بإمكانه القيام بخدع مثالية، يبقى المتزلج على الجليد يعمل على عدم فعل الانشقاقات، ربما تشبيه مبالغ فيه ولكن المبدأ ما زال قائما، الاستثمار في بايثون سيؤدي إلى نتائج رائعة لكن يجب بذل الوقت للتعلم حتى يمكن استحقاق هذه القوة.

الجانب السيئ الأخر في استخدام بايثون في البرمجة العلمية العامة هو المشهد الحالي للعرف و المصادر المتوفرة ، لأن ماتلاب اشتهر باستخدامه في مجالات عديدة و أصبح عرفا نشر النصوص البرمجية عبر ماتلاب( إلا في بعض مجالات الرياضيات التي يشتهر فيها استخدام بايثون بسبب وجود سيج أو في مجال الإحصائيات حيث تعتبر لغة R هي المعتمدة) بينما ام-لاب-راب MlabWrap يجعل الأمر يعمل بعدالة إلا أنه ما زال يعني أن مبرمج بايثون ما زال يحتاج إلى التعامل مع اللغتين و الحصول على رخصة ماتلاب، أي شخص يفكر في التبديل يجب أن يكون ملما بهذا الأمر المزعج ، على كل حال، يبدو أن هناك حراك قوي مع البحث العلمي بالتوجه إلى بايثون و بنسبة كبيرة للأسباب التي ذكرتها هنا.

 

حل برمجي متكامل

باختصار و تأكيدا لنظرتي كيف أن بايثون هي الحل البرمجي المتكامل، أتعرض لذكر ثلاث نقاط إضافية و كل نقطة ستفتح عليك بابا من التفكير. أولا أنها مفتوحة المصدر و مجانية بالكامل، حتى للاستخدام التجاري، والحال نفسه للكثير من المكتبات العلمية الجوهرية. ثانيا، أنها تعمل بسلاسة في بيئات ويندوز، ماك، لينكس و غيرهم، كما تعمل مكتبها الأساسية أيضا بنفس الشكل و أيضا مكتبات الطرف الثالث اللاتي سبق و تحدثت عنهن . ثالثا، أنها تعمل مع البرمجة السريعة للشفرات أو مع التطوير للمشاريع الكبيرة بشكل متساو. باستعراض سريع لبعض قصص نجاح بايثون المذكورة في موقع بايثون يعرض لنا الاختلاف بين بيئات العمل التي وفرت فيها بايثون لمبرمجيها حلول برمجية متكاملة و واسعة و مدعومة للبحث و البرمجة العلمية. على أية حال، أفضل ما أختم به كلامي هو ما قاله راندال مونري، مؤلف xkcd “( البرمجة أصبحت ممتعة مرة أخرى).

التذييل

[1]

http://www.python.org/doc/essays/foreword/

 

مصدر المقالة: http://www.stat.washington.edu/~hoytak/blog/whypython.html

تأليف: هويت كويبك طالب دكتوراه في قسم الإحصاء بجامعة واشنطن للمزيد تابع Hoyt Koepke

ترجمة: سُلاف سليمان

مراجعة: زايد السعيدي