Klongpyは、Numpyの力を活用する高性能ベクトル化された操作で知られるKlongアレイ言語のPython適応です。 「バッテリーを含む」哲学を採用すると、Klongpyは組み込みのモジュールとPythonの広大なエコシステムを組み合わせて、Klongの簡潔な構文で迅速なアプリケーション開発を促進します。
したがって、Klongpyは堅牢なツールとして立っており、Klongのシンプルさと、幅広い計算タスクに適したPythonの広範な機能をブレンドします。
pip3 install " klongpy[full] "Klongpyは、アレイ言語ランタイムであり、高性能データ分析と分散コンピューティングアプリケーションを構築するための強力なツールのセットでもあります。機能には次のものがあります。
これらの例でクロンピーを探索してください。各スニペットは、クロンのユニークな側面を強調し、さまざまなプログラミングシナリオでその汎用性を示しています。
始める前に、あなたは疑問に思うかもしれません:なぜSyntaxがそんなにTerseなのか?
答えは、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::{+/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
ベクトルは182倍に勝ちます!なぜ?バルクベクトル操作を実行すると、CPUは計算全体が一度に提示されているため、オーバーヘッドがはるかに少ない数学を実行し、一度にさらに多くの操作を実行できるためです。
Klongpyは、このベクトル化プロパティを便利に活用できるツールを提供することを目指しています。
書き込むコードが少なく、計算するのが高速です。
Klongpyは、両方のストレングットを結合できるように、シームレスにPythonと統合します。 PythonのKlongpyを使いやすく、その逆も同様です。
たとえば、Klongpyで操作したいデータがPythonにあるとしましょう。 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は、舞台裏でゼロコピーNumpyアレイ操作を使用するDuckDBと呼ばれる高性能カラムストアを活用します。このデータベースにより、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接続を扱います。これらの機能により、サーバーを呼び出して、メモリにあるものを要求することができます。たとえば、他の関数や値などになります。たとえば、リモート関数への参照を求めることができ、呼び出すとarguemntsを使用してtehサーバーで実行されるローカル関数が得られます。この一般的な「リモートプロキシ」アプローチを使用すると、すべてのコードがローカルで実行されているのと同じ方法でクライアントコードを記述できます。
これを実行しているのを確認するには、サーバーに「AVG」関数があり、クライアントがそれを呼び出したい単純なシナリオをセットアップしましょう。
1つの端末からサーバーを起動します。
?> 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
リモート関数には時間がかかる場合があるため、Asyncラッパーでラップして、完了時にコールバックを呼び出すことができます。
?> afn::.async(myavg;{.d("Avg calculated: ");.p(x)})
async::monad
?> afn(!100)
Avg calculated: 49.5
1
IPCに加えて、標準のWebサーバーを介してデータを公開することもできます。この機能により、コンテンツを提供する他のコンテンツを提供する方法があります。これは、いくつかの計算に関する興味深い詳細を公開するか、他の理由で単純なWebサーバーを公開できます。
1つのインデックスハンドラーを追加する次のコードを使用して、web.kgというファイルを作成しましょう。
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
このWebサーバーを次のように実行できます。
$ 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 klongpyCupy Prebuilt BinaryまたはSourceから選択してください。注意、CupyのROCMサポートは実験的であり、おそらく問題があるでしょう。
'cupy' => build from source 'cuda12x' => "cuda11x '=>" cuda111' => "cuda111" 'cuda110' => "cudy-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はNumpyと100%互換性がないため、現在、2つのバックエンドの間にKlongpyにいくつかのギャップがあります。特に、文字列はCupyアレイでサポートされているため、Klongpy GPUサポートは現在数学に限定されています。
継続中の主要な作業には次のものが含まれます。
Klongpyは事実上、Klong言語のスーパーセットですが、いくつかの重要な違いがあります。
git clone https://github.com/briang/klongpy.git cd klongpy python3 setup.py Develop
python3 -m unittestKlongでの仕事とこの興味深いプロジェクトの基礎を提供してくれたNils M Holmに感謝します。