Klongpy是Klong Array語言的Python改編,以其高性能的矢量操作而聞名,該操作利用了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::{+/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獲勝!為什麼?因為當您執行批量矢量操作時,CPU可以用少得多的開銷執行數學,並且一次執行更多操作,因為它立即顯示了整個計算。
klongpy的目的是為您提供可讓您方便利用此矢量化屬性的工具 - 然後快速!
更少的編寫代碼和更快的計算代碼。
klongpy與Python無縫集成,因此可以將兩者的strenghts組合在一起。使用Python的Klongpy很容易,反之亦然。
例如,假設我們在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 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陣列操作在幕後。該數據庫允許在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
相互處理通信(IPC)使您可以構建分佈式和互連的klongpy程序和服務。
klongpy將IPC連接視為功能。這些功能讓您調用服務器並詢問其內存中的內容 - 它們可以是其他功能或值等。這種通用的“遠程代理”方法使您可以以與所有代碼在本地運行一樣編寫客戶碼。
要查看此操作,讓我們設置一個簡單的方案,其中服務器具有“ 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服務器曝光數據。此功能使您有其他方法可以通過其他原因來揭示有關某些計算的有趣詳細信息,或者只是出於其他原因。
讓我們創建一個名為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 klongpy選擇您的Cupy預製二進製或從源中選擇。請注意,ROCM對CUPY的支持是實驗性的,可能會遇到問題。
'cupy'=>由源'cuda12x'=>“ cupy-cuda12x”'cuda11x'=>“ cupy-cuda11x”'cuda111'''cuda111'=>“ cupy-cuda111”'cuda110''cuda110'=>“ cupy-cuda110” “ 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%,因此兩個後端之間的Klongpy存在一些差距。值得注意的是,弦陣列中的琴弦得到了支撐,因此klongpy GPU目前僅限於數學。
主要正在進行的工作包括:
Klongpy實際上是Klong語言的超集,但有一些關鍵差異:
git克隆https://github.com/briangu/klongpy.git cd klongpy python3 setup.py開發
python3 -m unittest非常感謝Nils M Holm在Klong上的工作,並為這個有趣的項目提供了基礎。