Klongpy هي تكيف Python للغة Klong Array ، والمعروفة بعملياتها ذات الأداء العالي الموجه التي تستفيد من قوة Numpy. مع احتضان فلسفة "البطاريات" ، يجمع Klongpy بين الوحدات النمطية المدمجة والنظام الإيكولوجي الواسع في Python ، مما يسهل تطوير التطبيق السريع مع بناء الجملة Klong المختصرة.
وهكذا ، يقف Klongpy كأداة قوية ، حيث تمزج بساطة Klong مع إمكانات واسعة من Python ، مناسبة لمجموعة واسعة من المهام الحسابية.
pip3 install " klongpy[full] "Klongpy هو وقت تشغيل لغة المصفوفة ومجموعة من الأدوات القوية لبناء تحليل البيانات عالية الأداء وتطبيقات الحوسبة الموزعة. تشمل بعض الميزات:
استكشاف Klongpy مع هذه الأمثلة. يبرز كل مقتطف جانبًا فريدًا من Klong ، مما يدل على تعدد استخداماته في سيناريوهات البرمجة المختلفة.
قبل أن نبدأ ، قد تتساءل: لماذا بناء الجملة للغاية؟
الجواب هو أنه يعتمد على برمجة لغة صفيف APL ، وهناك سبب وجيه لأن طبيعتها المدمجة مفيدة بالفعل.
يتيح لك نمط لغة الصفيف وصف ما تريد أن يفعله الكمبيوتر ويتيح للكمبيوتر معرفة كيفية القيام بذلك. هذا يحررك من التفاصيل أثناء السماح للكمبيوتر باكتشاف كيفية الذهاب بأسرع وقت ممكن.
كود أقل للكتابة والتنفيذ بشكل أسرع.
فقط ، فإن الأمثلة التالية أكثر منطقية عندما ترى مخرجات Repl ، هناك بعض القواعد السريعة حول وظائف Klong. تستغرق الوظائف فقط ما يصل إلى 3 معلمات ويطلق عليها دائمًا x و y و z.
وظيفة مع
السبب في أن وظائف Klong لا تأخذ إلا ما يصل إلى 3 معلمات وتسميتها لك هو الكيدات والضغوط.
$ rlwrap kgpy
Welcome to KlongPy REPL v0.6.0
Author: Brian Guarraci
Web: http://klongpy.org
]h for help ; crtl-d or ]q to quit
? > دعنا نبدأ مع الأساسيات ونبناء لبعض الرياضيات الأكثر إثارة للاهتمام. يتم تقييم التعبيرات من اليمين إلى اليسار: 3*2 ثم + 5
?> 5+3*2
11
Klongpy يدور حول صفائف الأشياء ، لذلك دعونا نحدد وظائف SUM و COUNT على صفيف:
?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
الآن بعد أن عرفنا مجموع وعدد العناصر التي يمكننا حساب المتوسط:
?> avg::{sum(x)%count(x)} :" average is the sum divided by the number of elements
:monad
?> avg([1 2 3])
2
دعنا نحفر في عمليات أكثر إثارة للاهتمام على عناصر الصفيف. هناك اختلافات كبيرة في الأداء في كيفية تعاملك مع المشكلة ومن المهم رؤية الفرق.
للحصول على حالة بسيطة من الأرقام التربيعية في القائمة ، دعنا نجرب حلول زوجين:
?> {x*x}'[1 2 3 4 5] :" square each element as we iterate over the array
[1 4 9 16 25]
سوف يقوم النهج المتجه بتكاثر العنصر بكميات كبيرة:
?> a::[1 2 3 4 5];a*a :" a*a multiplies the arrays
[1 4 9 16 25]
النهج المتجه سيكون أسرع بكثير. دعنا نرفع حجم الصفيف ووقت الوقت:
$> .l("time")
:monad
$> a::!1000;#a
1
$> fast::{{a*a}'!1000}
:nilad
$> slow::{{{x*x}'a}'!1000}
:nilad
$> time(fast)
0.015867948532104492
$> time(slow)
2.8987138271331787
المتجهات الفوز بحلول 182x! لماذا؟ لأنه عند إجراء عملية متجه بالجملة ، يمكن لوحدة المعالجة المركزية أن تؤدي الرياضيات بأقل بكثير من النفقات العامة والقيام بالعديد من العمليات في وقت واحد لأنها تحتوي على حساب كامل مقدم إليه مرة واحدة.
يهدف Klongpy إلى منحك أدوات تتيح لك استغلال خاصية Vectorization بشكل مريح - والذهاب بسرعة!
كود أقل للكتابة وأسرع لحساب.
يدمج Klongpy بسلاسة مع Python بحيث يمكن الجمع بين Strenghts لكلا. من السهل استخدام Klongpy من Python والعكس بالعكس.
على سبيل المثال ، دعنا نقول أن لدينا بعض البيانات في Python التي نريد العمل عليها في Klongpy. يمكننا فقط استخدام المترجم المترجم في Python وتشغيل وظائف على البيانات التي وضعناها في سياق Klongpy:
from klongpy import KlongInterpreter
import numpy as np
data = np . array ([ 1 , 2 , 3 , 4 , 5 ])
klong = KlongInterpreter ()
# make the data NumPy array available to KlongPy code by passing it into the interpreter
# we are creating a symbol in KlongPy called 'data' and assigning the external NumPy array value
klong [ 'data' ] = data
# define the average function in KlongPY
klong ( 'avg::{(+/x)%#x}' )
# call the average function with the external data and return the result.
r = klong ( 'avg(data)' )
print ( r ) # expected value: 3ليس من المنطقي كتابة التعليمات البرمجية في Klong الموجودة بالفعل في المكتبات الأخرى. يمكننا الوصول إليها مباشرة عبر وظائف Python outport (.py و .pyf).
ماذا عن استخدام Numpy FFT؟
?> .pyf("numpy";"fft");fft::.pya(fft;"fft")
:monad
?> signal::[0.0 1.0 0.0 -1.0] :" Example simple signal
[0.0 1.0 0.0 -1.0]
?> result::fft(signal)
[0j -2j 0j 2j]
يمكنك الآن استخدام Numpy أو المكتبات الأخرى لتوفير وظائف معقدة بينما يتيح لك Klongpy إعداد المتجهات ومعالجتها بسرعة.
هناك الكثير مما يمكننا القيام به مع interop ولكن دعنا ننتقل الآن!
يعمل Klongpy على الاستفادة من متجر عمودي عالي الأداء يسمى DuckDB الذي يستخدم عمليات صفيف صفر نومبي خلف الكواليس. تتيح قاعدة البيانات هذه interop سريعًا بين Klongpy و DuckDB (لا يتم نسخ المصفوفات) بحيث يمكن للتطبيقات إدارة المصفوفات في Klongpy ثم تنفيذ SQL على الفور على البيانات للحصول على رؤى أعمق.
من السهل إنشاء جدول و DB للاستعلام:
?> .py("klongpy.db")
?> t::.table([["name" ["Alice" "Bob"]] ["age" [25 30]]])
name age
Alice 25
Bob 30
?> db::.db(:{},"T",t)
?> db("select * from T where age > 27")
name age
Bob 30
يتيح لك Inter Process Communication (IPC) إنشاء برامج وخدمات Klongpy الموزعة والمرتبطة.
يعامل Klongpy اتصالات IPC للخوادم كوظائف. تتيح لك هذه الوظائف الاتصال بالخادم وطلب الأشياء التي لديها في ذاكرتها - يمكن أن تكون وظائف أو قيم أخرى ، وما إلى ذلك ، على سبيل المثال ، يمكنك طلب مرجع إلى وظيفة عن بُعد وستحصل على وظيفة محلية عند الاتصال بها على خادم TEH مع جثرك. يتيح لك هذا النهج العام "الوكيل البعيد" كتابة رمز العميل الخاص بك بالطريقة نفسها كما لو كانت جميع الكود تعمل محليًا.
للاطلاع على ذلك في العمل ، دعنا ننشئ سيناريوًا بسيطًا حيث يحتوي الخادم على وظيفة "AVG" ويريد العميل تسميته.
بدء خادم في محطة واحدة:
?> avg::{(+/x)%#x}
:monad
?> .srv(8888)
1
ابدأ العميل وجعل الاتصال بالخادم "F". من أجل تمرير المعلمات إلى دالة عن بعد ، فإننا نشكل مجموعة من رمز الوظيفة تليها المعلمات (على سبيل المثال: AVG ،! 100)
?> f::.cli(8888) :" connect to the server
remote[localhost:8888]:fn
?> f(:avg,,!100) : call the remote function "avg" directly with the paramter !100
49.5
دعنا نتخيل ونجعل الوكيل المحلي للوظيفة عن بُعد:
?> myavg::f(:avg) :" reference the remote function by it's symbol :avg and assign to a local variable called myavg
remote[localhost:8888]:fn:avg:monad
?> myavg(!100) :" this runs on the server with !100 array passed to it as a parameter
49.5
نظرًا لأن الوظائف البعيدة قد تستغرق بعض الوقت ، يمكننا لفها باستخدام غلاف غير متزامن وجعلها تتصل باستدعاءنا عند الانتهاء:
?> afn::.async(myavg;{.d("Avg calculated: ");.p(x)})
async::monad
?> afn(!100)
Avg calculated: 49.5
1
بالإضافة إلى IPC ، يمكننا أيضًا فضح البيانات عبر خادم ويب قياسي. تتيح لك هذه الإمكانية أن يكون لديك طرق أخرى لخدمة المحتوى الذي يمكن أن تكشف تفاصيل مثيرة للاهتمام حول بعض الحسابات أو مجرد خادم ويب بسيط لأسباب أخرى.
دعنا نقوم بإنشاء ملف يسمى web.kg مع الكود التالي الذي يضيف معالج فهرس واحد:
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
يمكننا تشغيل خادم الويب هذا على النحو التالي:
$ kgpy web.kg
ready at http://localhost:8888في محطة أخرى:
$ curl http://localhost:8888
[ ' Hello, Klong World! ' 0 1 2 3 4 5 6 7 8 9]تم تصميم هذه الأمثلة لتوضيح نهج "البطاريات المتضمنة" ، وسهولة الاستخدام والتطبيقات المتنوعة لـ Klongpy ، مما يجعلها خيارًا متعدد الاستخدامات لتلبية احتياجات البرمجة المختلفة.
تحقق من مجلد الأمثلة للمزيد.
pip3 install klongpyاختر ثنائيًا لكوب بنيت أو من المصدر. لاحظ أن دعم ROCM لـ CUPY تجريبي ومن المحتمل أن يكون لديه مشاكل.
'cupy' => بناء من المصدر 'cuda12x' => "cupy-cuda12x" '' cuda11x '=> "cupy-cuda11x"' cuda111 '=> "cupy-cuda111"' cuda110 '=> "cupy-cuda110"' cuda102 '=> "Cupy-ROCM-5-0" 'ROCM-4-3' => "Cupy-ROCM-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy هي مجموعة من لغة صفيف Klong. إنه يجتاز حاليًا جميع اختبارات التكامل التي توفرها Klong بالإضافة إلى الأجنحة الإضافية.
نظرًا لأن Cupy لا يتوافق بنسبة 100 ٪ مع Numpy ، فهناك حاليًا بعض الثغرات في Klongpy بين الواجهة الخلفية. والجدير بالذكر أن الأوتار مدعومة في صفائف كأس بحيث يقتصر دعم وحدة معالجة الرسومات Klongpy حاليًا على الرياضيات.
يشمل العمل الجاري الأساسي:
Klongpy هي فعليًا مجموعة من اللغة Klong ، ولكن لديها بعض الاختلافات الرئيسية:
git clone https://github.com/briangu/klongpy.git cd klongpy python3 setup.py تطوير
python3 -m unittestشكر كبير لـ Nils M Holm على عمله في Klong وتوفير الأسس لهذا المشروع المثير للاهتمام.