Klongpy-это адаптация на питоне языка массива Klong, известная своими высокоэффективными векторизованными операциями, которые используют силу Numpy. Охватывая философию «батареи», Klongpy объединяет встроенные модули с обширной экосистемой Python, способствуя быстрому развитию применения с кратким синтаксисом Клонга.
Таким образом, Klongpy является надежным инструментом, смешивая простоту Klong с обширными возможностями Python, подходящих для широкого спектра вычислительных задач.
pip3 install " klongpy[full] "Klongpy - это как средняя среда, так и набор мощных инструментов для создания высокопроизводительного анализа данных и распределенных вычислительных приложений. Некоторые из функций включают в себя:
Исследуйте Klongpy с этими примерами. Каждый фрагмент выделяет уникальный аспект Klong, демонстрируя его универсальность в различных сценариях программирования.
Прежде чем мы начнем, вы можете задаться вопросом: почему синтаксис такой терпимый?
Ответ заключается в том, что он основан на языковом программировании массива в стиле APL, и есть веская причина, по которой его компактная природа на самом деле полезна.
Стиль языка массива позволяет вам описать, что вы хотите, чтобы компьютер сделал, и он позволяет компьютеру понять, как это сделать. Это освобождает вас от деталей, позволяя компьютеру понять, как идти как можно быстрее.
Меньше кода для написания и более быстрого выполнения.
Просто так, что следующие примеры имеют больше смысла, когда вы видите выходы реплики, существует несколько быстрых правил о функциях 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::{+/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 стремится дать вам инструменты, которые позволяют вам удобно эксплуатировать это свойство векторизации - и идти быстро!
Меньше кода для написания и быстрее для вычисления.
Клонгпи легко интегрирует с Python, так что стригты обоих могут быть объединены. Это легко использовать 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Не имеет смысла писать код в Клонге, который уже существует в других библиотеках. Мы можем непосредственно получить к ним доступ через функции Python Inport (.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, в котором используются операции Numpy Array с нулевой копией за кулисами. Эта база данных позволяет быстро взаимосвязь между Klongpy и DuckDB (массивы не копируются), чтобы приложения могли управлять массивами в Klongpy, а затем мгновенно выполнять SQL в данных для более глубокого понимания.
Легко создать таблицу и дБ для запроса:
?> .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Выберите свой Cupy Prebuild Binary или из Source. Обратите внимание, что поддержка ROCM для Cupy является экспериментальной и, вероятно, будет иметь проблемы.
'cupy' => build из источника 'cuda12x' => "cupy-cuda12x" 'cuda11x' => "cupy-cuda11x" 'cuda111' => "cupy-cuda111" 'cuda110' => "Cupy-Cuda110" Cuda102 '=> "cupy-cuda102" rac110 "' cuda102 '=>" cupy-cuda102 "rcm-5-5->' = 5-5-5-5-5-> '= 5-5-5-5-> 0110". "Cupy-Rocm-5-0" "Rocm-4-3 '=>" Cupy-Rocm-4-3 "
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy - это суперсет языка массива Klong. В настоящее время он проходит все интеграционные тесты, предоставленные Клонгом, а также дополнительные люксы.
Поскольку Cupy не совместим с Numpy на 100%, в настоящее время в Klongpy есть некоторые пробелы между двумя бэкэнами. Примечательно, что строки поддерживаются в массивах Cupy, поэтому поддержка GPU Klongpy в настоящее время ограничивается математикой.
Первичная текущая работа включает в себя:
Клонгпи фактически является суперсетом языка Клонга, но имеет некоторые ключевые различия:
git clone https://github.com/briangu/klongpy.git cd klongpy python3 setup.py развивать
python3 -m unittestОгромное спасибо Nils M Holm за его работу на Клонге и предоставление фондов для этого интересного проекта.