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上的工作,并为这个有趣的项目提供了基础。