Klongpy ist eine Python-Adaption der Klong-Array-Sprache, die für ihre leistungsstarken operativen Operationen bekannt ist, die die Kraft von Numph nutzen. Klongpy umfasst eine "Batterien" Philosophie und kombiniert integrierte Module mit Pythons expansives Ökosystem und ermöglicht die schnelle Anwendungsentwicklung mit Klongs kurzer Syntax.
Klongpy ist somit ein robustes Werkzeug, das die Einfachheit von Klong mit den umfangreichen Fähigkeiten von Python verbindet, die für eine Vielzahl von Rechenaufgaben geeignet sind.
pip3 install " klongpy[full] "Klongpy ist sowohl eine Array -Laufzeit als auch eine Reihe leistungsstarker Tools zum Erstellen von Hochleistungsdatenanalysen und verteilten Computeranwendungen. Einige der Funktionen umfassen:
Erkunden Sie Klongpy mit diesen Beispielen. Jeder Snippet zeigt einen einzigartigen Aspekt von Klong und demonstriert seine Vielseitigkeit in verschiedenen Programmierszenarien.
Bevor wir anfangen, fragen Sie sich vielleicht: Warum ist die Syntax so knapp?
Die Antwort ist, dass es auf der APL -Array -Sprachprogrammierung basiert und es einen guten Grund gibt, warum seine kompakte Natur tatsächlich hilfreich ist.
Mit Array -Sprachstil können Sie beschreiben, was der Computer ausführen soll, und ermöglicht den Computer heraus, wie es geht. Dadurch werden Sie von den Details befreit, während der Computer herausfindet, wie man so schnell wie möglich geht.
Weniger Code zum Schreiben und einer schnelleren Ausführung.
Nur damit die folgenden Beispiele sinnvoller sind, wenn Sie die Repl -Ausgänge sehen, gibt es einige schnelle Regeln für Klong -Funktionen. Funktionen nehmen nur bis zu 3 Parameter und sie werden immer X, Y und Z genannt.
Eine Funktion mit
Der Grund, warum Klong funktioniert, ist nur bis zu 3 Parameter und nennt sie für Sie sowohl Überzeugung als auch Kompaktheit.
$ 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
? > Beginnen wir mit den Grundlagen und machen uns eine weitere interessante Mathematik auf. Ausdrücke werden von rechts nach links bewertet: 3*2 und dann + 5
?> 5+3*2
11
In Klongpy geht es mehr um Arrays von Dingen. Definieren wir also Summe und Zählerfunktionen über ein Array:
?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
Nachdem wir die Summe und die Anzahl der Elemente kennen, können wir den Durchschnitt berechnen:
?> avg::{sum(x)%count(x)} :" average is the sum divided by the number of elements
:monad
?> avg([1 2 3])
2
Lassen Sie uns über Array -Elemente interessantere Operationen ausgraben. Es gibt wirklich große Leistungsunterschiede in der Art und Weise, wie Sie sich dem Problem nähern, und es ist wichtig, den Unterschied zu erkennen.
Für den einfachen Fall von Quadratnummern in einer Liste versuchen wir einige Lösungen:
?> {x*x}'[1 2 3 4 5] :" square each element as we iterate over the array
[1 4 9 16 25]
Der vektorisierte Ansatz führt eine elementbezogene Multiplikation in Masse durch:
?> a::[1 2 3 4 5];a*a :" a*a multiplies the arrays
[1 4 9 16 25]
Der vektorisierte Ansatz wird viel schneller sein. Lassen Sie uns die Größe des Arrays und der Zeit aufdrehen:
$> .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
Vektoren gewinnen bis 182x! Warum? Denn wenn Sie einen Bulk -Vektor -Betrieb ausführen, kann die CPU die Mathematik mit viel weniger Overhead ausführen und viel mehr Operationen gleichzeitig ausführen, da die gesamte Berechnung gleichzeitig vorgestellt wird.
Klongpy zielt darauf ab, Ihnen Tools zu geben, mit denen Sie diese Vektorisierungseigenschaft bequem ausnutzen können - und schnell gehen!
Weniger Code zu schreiben und schneller zu berechnen.
Klongpy integriert nahtlos in Python, so dass die Strahlen beider kombiniert werden können. Es ist einfach, Klongpy von Python und umgekehrt zu verwenden.
Angenommen, wir haben einige Daten in Python, die wir in Klongpy betreiben möchten. Wir können den Interpreter in Python einfach direkt verwenden und Funktionen für Daten ausführen, die wir in den Klongpy -Kontext einfügen:
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: 3Es ist nicht sinnvoll, Code in Klong zu schreiben, der bereits in anderen Bibliotheken existiert. Wir können direkt über die Python Inport -Funktionen (.py und .pyf) auf sie zugreifen.
Wie wäre es, wenn wir das Numpy FFT verwenden?
?> .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]
Jetzt können Sie Numpy oder andere Bibliotheken verwenden, um komplexe Funktionen bereitzustellen, während Sie mit Klongpy die Vektoren schnell vorbereiten und verarbeiten können.
Wir können viel mehr mit Interop machen, aber lassen Sie uns vorerst weitermachen!
Klongpy nutzt einen Hochleistungs-Säulengeschäft namens Duckdb, in dem Null-Copy-Numpy-Array-Operationen hinter den Kulissen verwendet werden. Diese Datenbank ermöglicht einen schnellen Interop zwischen Klongpy und Duckdb (die Arrays werden nicht kopiert), damit Anwendungen Arrays in Klongpy verwalten und dann sofort SQL für die Daten für tiefere Einblicke ausführen können.
Es ist einfach, einen Tisch und eine DB zur Abfrage zu erstellen:
?> .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
Mit IPC (Inter Process Communication) können Sie verteilte und miteinander verbundene Klongpy -Programme und -Dienste erstellen.
Klongpy behandelt IPC -Verbindungen zu Servern als Funktionen. Mit diesen Funktionen können Sie den Server anrufen und nach Dingen fragen, die er in seinem Speicher enthält. Sie können andere Funktionen oder Werte usw. sein. Zum Beispiel können Sie eine Referenz auf eine Remote -Funktion bitten, und Sie erhalten eine lokale Funktion, die Sie, wenn Sie ihn aufrufen, auf dem Teh -Server mit Ihren Arguemnts ausgeführt werden. Mit diesem allgemeinen "Remote -Proxy" -Ansatz können Sie Ihren Client -Code auf die gleiche Weise schreiben, als ob der gesamte Code lokal ausgeführt wurde.
Um dies in Aktion zu sehen, setzen wir ein einfaches Szenario ein, in dem der Server eine "AVG" -Funktion hat und der Client es aufrufen möchte.
Starten Sie einen Server in einem Terminal:
?> avg::{(+/x)%#x}
:monad
?> .srv(8888)
1
Starten Sie den Client und stellen Sie die Verbindung zum Server als "f" her. Um Parameter an eine Remote -Funktion zu übergeben, bilden wir ein Array des Funktionsymbols, gefolgt von den Parametern (z. B.: 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
Lassen Sie uns Lust haben und einen lokalen Stellvertreter zur Remote -Funktion machen:
?> 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
Da Remote -Funktionen eine Weile dauern können, können wir sie mit einem asynchronen Wrapper einwickeln und unseren Rückruf anrufen, wenn sie fertiggestellt werden:
?> afn::.async(myavg;{.d("Avg calculated: ");.p(x)})
async::monad
?> afn(!100)
Avg calculated: 49.5
1
Zusätzlich zu IPC können wir Daten über einen Standard -Webserver freilegen. Mit dieser Fähigkeit können Sie andere Möglichkeiten haben, Inhalte zu bedienen, die entweder interessante Details über eine Berechnung oder nur einen einfachen Webserver aus anderen Gründen aufdecken können.
Erstellen wir eine Datei namens web.kg mit dem folgenden Code, der einen Indexhandler hinzufügt:
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
Wir können diesen Webserver wie folgt ausführen:
$ kgpy web.kg
ready at http://localhost:8888In einem anderen Terminal:
$ curl http://localhost:8888
[ ' Hello, Klong World! ' 0 1 2 3 4 5 6 7 8 9]Diese Beispiele sind so konzipiert, dass sie den Ansatz, die Benutzerfreundlichkeit und die verschiedenen Anwendungen von Klongpy veranschaulichen, was es zu einer vielseitigen Wahl für verschiedene Programmieranforderungen macht.
Weitere Informationen finden Sie im Beispieleordner.
pip3 install klongpyWählen Sie Ihren cupy vorgebauten Binär oder aus der Quelle. Beachten Sie, dass die ROCM -Unterstützung für Cupy experimentell ist und wahrscheinlich Probleme haben wird.
'Cupy' => Build aus Quelle 'CUDA12X' => "Cupy-Cuda12x" 'Cuda11x' => "Cupy-Cuda11x" 'cuda111' => "Cupy-Cuda111" 'Cuda110' => "Cupy-Cuda110" 'cuda102' => "upy-cuda10" "upy-cuda102" " "Cupy-ROCM-5-0" 'ROCM-4-3' => "Cupy-ROCM-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy ist ein Superet der Klong -Array -Sprache. Derzeit bestehen alle von Klong bereitgestellten Integrationstests sowie zusätzliche Suiten.
Da Cupy nicht zu 100% mit Numpy kompatibel ist, gibt es derzeit einige Lücken in Klongpy zwischen den beiden Backends. Bemerkenswerterweise werden Saiten in Cupy -Arrays unterstützt, sodass die Unterstützung der Klongpy GPU derzeit auf Mathematik beschränkt ist.
Die wichtigsten laufenden Arbeiten umfassen:
Klongpy ist effektiv ein Superet der Klong -Sprache, hat aber einige wichtige Unterschiede:
Git Clone https://github.com/brianggu/klongpy.git CD Klongpy Python3 Setup.py Entwickeln
python3 -m unittestVielen Dank an Nils M Holm für seine Arbeit an Klong und die Bereitstellung der Grundlagen für dieses interessante Projekt.