Klongpy es una adaptación de Python del lenguaje de matriz Klong, conocida por sus operaciones vectorizadas de alto rendimiento que aprovechan el poder de Numpy. Adoptar una filosofía de "baterías incluidas", Klongpy combina módulos incorporados con el ecosistema expansivo de Python, facilitando el desarrollo rápido de aplicaciones con la sintaxis sucinta de Klong.
Klongpy, por lo tanto, se destaca como una herramienta robusta, combinando la simplicidad de Klong con las extensas capacidades de Python, adecuada para una amplia gama de tareas computacionales.
pip3 install " klongpy[full] "Klongpy es un tiempo de ejecución de lenguaje de matriz y un conjunto de herramientas poderosas para construir análisis de datos de alto rendimiento y aplicaciones informáticas distribuidas. Algunas de las características incluyen:
Explore Klongpy con estos ejemplos. Cada fragmento destaca un aspecto único de Klong, que demuestra su versatilidad en varios escenarios de programación.
Antes de comenzar, es posible que se pregunte: ¿por qué la sintaxis es tan breve?
La respuesta es que se basa en la programación de lenguaje de matriz de estilo APL y hay una buena razón por la cual su naturaleza compacta es realmente útil.
El estilo de lenguaje de matriz le permite describir lo que desea que haga la computadora y le permite a la computadora descubrir cómo hacerlo. Esto lo libera de los detalles mientras deja que la computadora descubra cómo ir lo más rápido posible.
Menos código para escribir y una ejecución más rápida.
Solo para que los siguientes ejemplos tengan más sentido cuando ve las salidas REPL, hay algunas reglas rápidas sobre las funciones de Klong. Las funciones solo toman hasta 3 parámetros y siempre se llaman X, Y y Z.
Una función con
La razón por la que las funciones de Klong solo toman hasta 3 parámetros y los nombran es tanto la conviencia como la compacidad.
$ 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
? > Comencemos con los conceptos básicos y acumulemos a algunas matemáticas más interesantes. Las expresiones se evalúan de derecha a izquierda: 3*2 y luego + 5
?> 5+3*2
11
Klongpy se trata más de matrices de cosas, así que definamos las funciones de suma y cuenta sobre una matriz:
?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
Ahora que conocemos la suma y el número de elementos, podemos calcular el promedio:
?> avg::{sum(x)%count(x)} :" average is the sum divided by the number of elements
:monad
?> avg([1 2 3])
2
Invencemos en operaciones más interesantes sobre elementos de matriz. Hay realmente grandes diferencias de rendimiento en la forma en que aborda el problema y es importante ver la diferencia.
Para el caso simple de los números cuadrados en una lista, intentemos un par de soluciones:
?> {x*x}'[1 2 3 4 5] :" square each element as we iterate over the array
[1 4 9 16 25]
El enfoque vectorizado hará una multiplicación en forma de elemento a granel:
?> a::[1 2 3 4 5];a*a :" a*a multiplies the arrays
[1 4 9 16 25]
El enfoque vectorizado será mucho más rápido. Cambiemos el tamaño de la matriz y la hora:
$> .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
¡Los vectores ganan por 182X! ¿Por qué? Porque cuando realiza una operación vectorial a granel, la CPU puede realizar las matemáticas con mucho menos gastos generales y realizar muchas más operaciones a la vez porque tiene todo el cálculo presentado a la vez.
Klongpy tiene como objetivo brindarle herramientas que le permitan explotar convenientemente esta propiedad de vectorización, ¡y vaya rápido!
Menos código para escribir y más rápido para calcular.
Klongpy se integra a la perfección con Python para que se puedan combinar las fuerza de ambos. Es fácil usar Klongpy de Python y viceversa.
Por ejemplo, supongamos que tenemos algunos datos en Python que queremos operar en Klongpy. Podemos usar directamente el intérprete en Python y ejecutar funciones en los datos que ponemos en el contexto de 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: 3No tiene sentido escribir código en Klong que ya exista en otras bibliotecas. Podemos acceder directamente a ellos a través de las funciones de Python Inport (.py y .pyf).
¿Qué tal si usamos el FFT Numpy?
?> .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]
Ahora puede usar Numpy u otras bibliotecas para proporcionar funciones complejas, mientras que Klongpy le permite preparar rápidamente y procesar los vectores.
¡Hay mucho más que podemos hacer con Interopp, pero sigamos adelante por ahora!
Klongpy aprovecha una tienda columna de alto rendimiento llamada DuckDB que utiliza operaciones de matriz Numpy de copia cero detrás de escena. Esta base de datos permite la interoperabilidad rápida entre Klongpy y DuckDB (las matrices no se copian) para que las aplicaciones puedan administrar matrices en Klongpy y luego realizar instantáneamente SQL en los datos para obtener información más profunda.
Es fácil crear una mesa y un DB para consultar:
?> .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) le permite crear programas y servicios Klongpy distribuidos e interconectados.
Klongpy trata las conexiones IPC a los servidores como funciones. Estas funciones le permiten llamar al servidor y solicitar las cosas que tiene en su memoria: pueden ser otras funciones o valores, etc. Por ejemplo, puede solicitar una referencia a una función remota y obtendrá una función local que cuando lo llame se ejecuta en el servidor con sus argumentos. Este enfoque general de "proxy remoto" le permite escribir su código de cliente de la misma manera que si todo el código se ejecutara localmente.
Para ver esto en acción, configuremos un escenario simple en el que el servidor tenga una función "AVG" y el cliente quiere llamarlo.
Inicie un servidor en un terminal:
?> avg::{(+/x)%#x}
:monad
?> .srv(8888)
1
Inicie el cliente y haga la conexión al servidor como 'F'. Para pasar los parámetros a una función remota, formamos una matriz del símbolo de la función seguido de los parámetros (por ejemplo: 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
Vamos a ser elegantes y hacer un proxy local a la función remota:
?> 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
Dado que las funciones remotas pueden llevar un tiempo, podemos envolverlas con un envoltorio async y hacer que llame a nuestra devolución de llamada cuando se complete:
?> afn::.async(myavg;{.d("Avg calculated: ");.p(x)})
async::monad
?> afn(!100)
Avg calculated: 49.5
1
Además de IPC, también podemos exponer datos a través de un servidor web estándar. Esta capacidad le permite tener otras formas de servir contenido que puede exponer detalles interesantes sobre algún cálculo o simplemente un servidor web simple por otras razones.
Creemos un archivo llamado web.kg con el siguiente código que agrega un controlador de índice:
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
Podemos ejecutar este servidor web de la siguiente manera:
$ kgpy web.kg
ready at http://localhost:8888En otra terminal:
$ curl http://localhost:8888
[ ' Hello, Klong World! ' 0 1 2 3 4 5 6 7 8 9]Estos ejemplos están diseñados para ilustrar el enfoque de "baterías incluidas", facilidad de uso y diversas aplicaciones de Klongpy, lo que lo convierte en una opción versátil para diversas necesidades de programación.
Consulte la carpeta de ejemplos para obtener más información.
pip3 install klongpyElija su binario cupy prebuilt o de la fuente. Tenga en cuenta que el soporte ROCM para Cupy es experimental y probablemente tendrá problemas.
'cupy' => construir desde la fuente 'cuda12x' => "cupy-cuda12x" 'cuda11x' => "cupy-cuda11x" 'cuda111' => "cupy-cuda111" 'cuda110' => "cupy-cuda110" 'cuda102' => "cupy-cuda102" 'rocm-5-0-0' "Cupy-ROCM-5-0" 'ROCM-4-3' => "CUPY-ROCM-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy es un superconjunto del lenguaje de matriz de Klong. Actualmente pasa todas las pruebas de integración proporcionadas por Klong y suites adicionales.
Dado que Cupy no es 100% compatible con Numpy, actualmente hay algunos huecos en Klongpy entre los dos backends. En particular, las cuerdas son compatibles con matrices Cupy, por lo que el soporte de GPU de Klongpy actualmente se limita a las matemáticas.
El trabajo principal en curso incluye:
Klongpy es efectivamente un superconjunto del idioma Klong, pero tiene algunas diferencias clave:
Git clone https://github.com/briangu/klongpy.git cd klongpy python3 setup.py Desarrollar
python3 -m unittestMuchas gracias a Nils M Holm por su trabajo en Klong y proporcionando las bases para este interesante proyecto.