Klongpy는 Numpy의 힘을 활용하는 고성능 벡터화 된 작업으로 유명한 Klong 어레이 언어의 Python 적응입니다. "배터리 포함"철학을 수용하는 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는 파이썬과 완벽하게 통합하여 두 가지의 강도를 결합 할 수 있습니다. 파이썬에서 Klongpy를 사용하기 쉽고 그 반대도 마찬가지입니다.
예를 들어, Klongpy에서 작동하려는 Python에 데이터가 있다고 가정 해 봅시다. Klongpy 컨텍스트에 넣은 데이터에서 통역사를 Python에서 직접 사용하고 실행 기능을 사용할 수 있습니다.
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를 사용하면 벡터를 신속하게 준비하고 처리 할 수 있습니다.
우리가 인터 로프로 할 수있는 더 많은 것이 있지만 지금은 계속 진행합시다!
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
IPC (Inter Procection Communication)를 사용하면 분산 및 상호 연결된 Klongpy 프로그램 및 서비스를 구축 할 수 있습니다.
Klongpy는 IPC 연결을 서버에 대한 기능으로 취급합니다. 이러한 기능을 사용하면 서버를 호출하여 메모리에있는 것들을 요청할 수 있습니다. 다른 기능이나 값 등이 될 수 있습니다. 예를 들어 원격 기능에 대한 참조를 요청할 수 있으며 Arguemnts와 함께 TEH 서버에서 호출 할 때 로컬 기능을 얻을 수 있습니다. 이 일반적인 "원격 프록시"접근 방식을 사용하면 모든 코드가 로컬로 실행되는 것과 같은 방식으로 클라이언트 코드를 작성할 수 있습니다.
이를 확인하려면 서버에 "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.kg라는 파일을 만들어 봅시다.
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
이 웹 서버를 다음과 같이 실행할 수 있습니다.
$ 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'=> 소스에서 빌드 'cuda12x'=> "cupy-cuda12x" 'cuda11x'=> "cupy-cuda11x" 'cuda111'=> "cupy-cuda111" 'cuda110'=> "cupy-cuda110" 'cuda102'=> "cupy-cuda102" 'rocm-5-0'=> "cuda110 '=>"cuda110'=> "Cupy-Rocm-5-0" 'ROCM-4-3'=> "Cupy-Rocm-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy는 Klong Array Language의 슈퍼 세트입니다. 현재 Klong이 제공하는 모든 통합 테스트와 추가 스위트가 통과됩니다.
Cupy는 Numpy와 100% 호환되지 않기 때문에 현재 Klongpy에는 두 개의 백엔드 사이에 약간의 간격이 있습니다. 특히, 문자열은 Cupy Array에서 지원되므로 Klongpy GPU 지원은 현재 수학으로 제한됩니다.
주요 진행중인 작업에는 다음이 포함됩니다.
Klongpy는 사실상 Klong 언어의 슈퍼 세트이지만 몇 가지 주요 차이점이 있습니다.
git 클론 https://github.com/briangu/klongpy.git cd klongpy python3 setup.py 개발
python3 -m unittestKlong에 대한 그의 작업 과이 흥미로운 프로젝트의 기초를 제공 한 Nils M Holm에게 큰 감사를드립니다.