Klongpy adalah adaptasi Python dari bahasa array Klong, yang dikenal karena operasi vektor yang berkinerja tinggi yang memanfaatkan kekuatan Numpy. Merangkul filosofi "baterai termasuk", Klongpy menggabungkan modul bawaan dengan ekosistem Python yang luas, memfasilitasi pengembangan aplikasi yang cepat dengan sintaks ringkas Klong.
Klongpy dengan demikian berdiri sebagai alat yang kuat, memadukan kesederhanaan Klong dengan kemampuan luas Python, cocok untuk berbagai tugas komputasi.
pip3 install " klongpy[full] "Klongpy adalah runtime bahasa array dan satu set alat yang kuat untuk membangun analisis data berkinerja tinggi dan aplikasi komputasi terdistribusi. Beberapa fitur termasuk:
Jelajahi Klongpy dengan contoh -contoh ini. Setiap cuplikan menyoroti aspek unik Klong, menunjukkan keserbagunaannya dalam berbagai skenario pemrograman.
Sebelum kita mulai, Anda mungkin bertanya -tanya: mengapa sintaksnya begitu singkat?
Jawabannya adalah bahwa itu didasarkan pada pemrograman bahasa array gaya APL dan ada alasan bagus mengapa sifat kompaknya benar -benar membantu.
Gaya Bahasa Array memungkinkan Anda menggambarkan apa yang Anda ingin komputer lakukan dan memungkinkan komputer mencari cara melakukannya. Ini membebaskan Anda dari detail sambil membiarkan komputer mencari cara untuk pergi secepat mungkin.
Lebih sedikit kode untuk ditulis dan eksekusi lebih cepat.
Contoh -contoh berikut lebih masuk akal ketika Anda melihat output repl, ada beberapa aturan cepat tentang fungsi Klong. Fungsi hanya membutuhkan hingga 3 parameter dan mereka selalu disebut x, y dan z.
Fungsi dengan
Alasan bahwa fungsi Klong hanya mengambil hingga 3 parameter dan memberi nama mereka untuk Anda adalah kemuliaan dan kekompakan.
$ 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
? > Mari kita mulai dengan dasar -dasarnya dan bangun untuk beberapa matematika yang lebih menarik. Ekspresi dievaluasi dari kanan ke kiri: 3*2 dan kemudian + 5
?> 5+3*2
11
Klongpy lebih tentang array hal, jadi mari kita tentukan fungsi jumlah dan hitungan di atas array:
?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
Sekarang kita tahu jumlah dan jumlah elemen yang dapat kita hitung rata -rata:
?> avg::{sum(x)%count(x)} :" average is the sum divided by the number of elements
:monad
?> avg([1 2 3])
2
Mari kita gali operasi yang lebih menarik tentang elemen array. Ada perbedaan kinerja yang sangat besar dalam cara Anda mendekati masalah dan penting untuk melihat perbedaannya.
Untuk kasus sederhana nomor kuadrat dalam daftar, mari kita coba solusi pasangan:
?> {x*x}'[1 2 3 4 5] :" square each element as we iterate over the array
[1 4 9 16 25]
Pendekatan vektor akan melakukan penggandaan elemen dalam jumlah besar:
?> a::[1 2 3 4 5];a*a :" a*a multiplies the arrays
[1 4 9 16 25]
Pendekatan vektor akan jauh lebih cepat. Ayo engkol ukuran array dan waktu itu:
$> .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
Vektor menang dengan 182x! Mengapa? Karena ketika Anda melakukan operasi vektor curah, CPU dapat melakukan matematika dengan overhead yang jauh lebih sedikit dan melakukan lebih banyak operasi sekaligus karena memiliki seluruh perhitungan yang disajikan sekaligus.
Klongpy bertujuan untuk memberi Anda alat yang memungkinkan Anda dengan mudah mengeksploitasi properti vektorisasi ini - dan pergi cepat!
Lebih sedikit kode untuk ditulis dan lebih cepat untuk dihitung.
Klongpy terintegrasi mulus dengan Python sehingga strenghts keduanya dapat digabungkan. Sangat mudah untuk menggunakan Klongpy dari Python dan sebaliknya.
Sebagai contoh, katakanlah kami memiliki beberapa data di Python yang ingin kami operasikan di Klongpy. Kami hanya dapat secara langsung menggunakan interpreter di Python dan menjalankan fungsi pada data yang kami masukkan ke dalam konteks 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: 3Tidak masuk akal untuk menulis kode di Klong yang sudah ada di perpustakaan lain. Kami dapat secara langsung mengaksesnya melalui fungsi Python Inport (.py dan .pyf).
Bagaimana kalau kita menggunakan FFT numpy?
?> .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]
Sekarang Anda dapat menggunakan Numpy atau perpustakaan lain untuk menyediakan fungsi yang kompleks sementara Klongpy memungkinkan Anda dengan cepat mempersiapkan dan memproses vektor.
Ada banyak lagi yang bisa kita lakukan dengan Interop tetapi mari kita lanjutkan untuk saat ini!
Klongpy memanfaatkan toko kolumnar berkinerja tinggi yang disebut DuckDB yang menggunakan operasi array nol nol-copy di belakang layar. Basis data ini memungkinkan interop cepat antara Klongpy dan DuckDB (array tidak disalin) sehingga aplikasi dapat mengelola array dalam Klongpy dan kemudian secara instan melakukan SQL pada data untuk wawasan yang lebih dalam.
Sangat mudah untuk membuat meja dan DB untuk meminta:
?> .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) memungkinkan Anda membangun program dan layanan Klongpy yang didistribusikan dan saling berhubungan.
Klongpy memperlakukan koneksi IPC ke server sebagai fungsi. Fungsi -fungsi ini memungkinkan Anda memanggil server dan meminta hal -hal yang ada di dalam memori - mereka dapat berupa fungsi atau nilai lain, dll. Misalnya Anda dapat meminta referensi ke fungsi jarak jauh dan Anda akan mendapatkan fungsi lokal yang ketika Anda menyebutnya berjalan di server dengan arguemn Anda. Pendekatan umum "proxy jarak jauh" ini memungkinkan Anda untuk menulis kode klien Anda dengan cara yang sama seperti jika semua kode berjalan secara lokal.
Untuk melihat ini beraksi, mari kita atur skenario sederhana di mana server memiliki fungsi "AVG" dan klien ingin menyebutnya.
Mulai server di satu terminal:
?> avg::{(+/x)%#x}
:monad
?> .srv(8888)
1
Mulai klien dan buat koneksi ke server sebagai 'F'. Untuk meneruskan parameter ke fungsi jarak jauh, kami membentuk array simbol fungsi yang diikuti oleh parameter (misalnya: rata -rata,! 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
Mari kita menjadi mewah dan membuat proxy lokal ke fungsi jarak jauh:
?> 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
Karena fungsi jarak jauh mungkin membutuhkan waktu beberapa saat, kami dapat membungkusnya dengan pembungkus async dan meminta panggilan balik kami saat selesai:
?> afn::.async(myavg;{.d("Avg calculated: ");.p(x)})
async::monad
?> afn(!100)
Avg calculated: 49.5
1
Selain IPC, kami juga dapat mengekspos data melalui server web standar. Kemampuan ini memungkinkan Anda memiliki cara lain untuk melayani konten yang dapat mengekspos detail menarik tentang beberapa perhitungan atau hanya server web sederhana karena alasan lain.
Mari kita buat file yang disebut web.kg dengan kode berikut yang menambahkan satu indeks pawang:
.py("klongpy.web")
data::!10
index::{x; "Hello, Klong World! ",data}
.web(8888;:{},"/",index;:{})
.p("ready at http://localhost:8888")
Kami dapat menjalankan server web ini sebagai berikut:
$ kgpy web.kg
ready at http://localhost:8888Di terminal lain:
$ curl http://localhost:8888
[ ' Hello, Klong World! ' 0 1 2 3 4 5 6 7 8 9]Contoh -contoh ini dirancang untuk menggambarkan pendekatan "baterai termasuk", kemudahan penggunaan dan beragam aplikasi Klongpy, menjadikannya pilihan yang serba guna untuk berbagai kebutuhan pemrograman.
Lihat folder contoh untuk lebih lanjut.
pip3 install klongpyPilih biner prebuilt cupy Anda atau dari sumber. Catatan, dukungan ROCM untuk Cupy adalah eksperimental dan kemungkinan akan memiliki masalah.
'cupy' => Build dari sumber 'cuda12x' => "cupy-cuda12x" 'cuda11x' => "cupy-cuda11x" 'cuda111' => "cupy-cuda111" 'cuda110' => "cupy-cuda110" 'cuda102' => cupy = cupy-cuda110 ' "cupy-rocm-5-0" 'rocm-4-3' => "cupy-rocm-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy adalah superset dari bahasa array Klong. Saat ini melewati semua tes integrasi yang disediakan oleh Klong serta suite tambahan.
Karena Cupy tidak 100% kompatibel dengan Numpy, saat ini ada beberapa celah dalam Klongpy di antara dua backend. Khususnya, string didukung dalam array cupy sehingga dukungan GPU Klongpy saat ini terbatas pada matematika.
Pekerjaan primer yang sedang berlangsung meliputi:
Klongpy secara efektif merupakan superset dari bahasa Klong, tetapi memiliki beberapa perbedaan utama:
git clone https://github.com/briaangu/klongpy.git cd klongpy python3 setup.py kembangkan
python3 -m unittestTerima kasih banyak kepada Nils M Holm atas karyanya di Klong dan menyediakan fondasi untuk proyek yang menarik ini.