Klongpy เป็นการปรับตัวของภาษา Klong Array ซึ่งเป็นที่รู้จักกันดีในการดำเนินงานเวกเตอร์ประสิทธิภาพสูงที่ใช้ประโยชน์จากพลังของ Numpy การรวบรวมปรัชญา "แบตเตอรี่รวม" Klongpy ผสมผสานโมดูลในตัวเข้ากับระบบนิเวศที่กว้างขวางของ Python ซึ่งอำนวยความสะดวกในการพัฒนาแอปพลิเคชันอย่างรวดเร็วด้วยไวยากรณ์สั้นของ Klong
Klongpy จึงเป็นเครื่องมือที่แข็งแกร่งผสมผสานความเรียบง่ายของ Klong เข้ากับความสามารถที่กว้างขวางของ Python ซึ่งเหมาะสำหรับงานการคำนวณที่หลากหลาย
pip3 install " klongpy[full] "Klongpy เป็นทั้งรันไทม์ภาษาอาเรย์และชุดเครื่องมือที่ทรงพลังสำหรับการสร้างการวิเคราะห์ข้อมูลประสิทธิภาพสูงและแอปพลิเคชันการคำนวณแบบกระจาย คุณสมบัติบางอย่างรวมถึง:
สำรวจ Klongpy ด้วยตัวอย่างเหล่านี้ ตัวอย่างแต่ละตัวอย่างเน้นมุมมองที่เป็นเอกลักษณ์ของ Klong แสดงให้เห็นถึงความเก่งกาจในสถานการณ์การเขียนโปรแกรมต่างๆ
ก่อนที่เราจะเริ่มต้นคุณอาจสงสัยว่า ทำไมไวยากรณ์ถึงสั้น?
คำตอบคือมันขึ้นอยู่กับการเขียนโปรแกรมภาษาอาร์เรย์สไตล์ APL และมีเหตุผลที่ดีว่าทำไมธรรมชาติที่กะทัดรัดจึงมีประโยชน์จริง
รูปแบบภาษาอาเรย์ช่วยให้คุณอธิบายสิ่งที่คุณต้องการให้คอมพิวเตอร์ทำและช่วยให้คอมพิวเตอร์หาวิธีทำ สิ่งนี้ทำให้คุณขึ้นจากรายละเอียดในขณะที่ให้คอมพิวเตอร์คิดว่าจะไปได้เร็วที่สุดเท่าที่จะทำได้
รหัสน้อยลงในการเขียนและการดำเนินการที่เร็วขึ้น
เพียงตัวอย่างต่อไปนี้ก็สมเหตุสมผลมากขึ้นเมื่อคุณเห็นเอาต์พุตแทนที่มีกฎอย่างรวดเร็วเกี่ยวกับฟังก์ชั่น 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 อย่างราบรื่นเพื่อให้สามารถรวมกันได้ มันง่ายที่จะใช้ Klongpy จาก Python และในทางกลับกัน
ตัวอย่างเช่นสมมติว่าเรามีข้อมูลบางอย่างใน 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 ที่เป็นศูนย์ที่อยู่เบื้องหลัง ฐานข้อมูลนี้ช่วยให้ interop อย่างรวดเร็วระหว่าง klongpy และ duckdb (อาร์เรย์ไม่ได้คัดลอก) เพื่อให้แอปพลิเคชันสามารถจัดการอาร์เรย์ใน Klongpy แล้วดำเนินการ SQL บนข้อมูลสำหรับข้อมูลเชิงลึกที่ลึกซึ้งยิ่งขึ้น
เป็นเรื่องง่ายที่จะสร้างตารางและฐานข้อมูลเพื่อสอบถาม:
?> .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 กับเซิร์ฟเวอร์เป็นฟังก์ชั่น ฟังก์ชั่นเหล่านี้ให้คุณเรียกเซิร์ฟเวอร์และขอสิ่งที่มีอยู่ในหน่วยความจำ - พวกเขาสามารถเป็นฟังก์ชั่นหรือค่าอื่น ๆ ฯลฯ ตัวอย่างเช่นคุณสามารถขออ้างอิงถึงฟังก์ชั่นระยะไกลและคุณจะได้รับฟังก์ชั่นท้องถิ่นที่เมื่อคุณเรียกมันว่าทำงานบนเซิร์ฟเวอร์ TEH กับ arguemnts ของคุณ วิธี "พร็อกซีระยะไกล" ทั่วไปนี้ช่วยให้คุณสามารถเขียนรหัสไคลเอนต์ของคุณในลักษณะเดียวกับที่รหัสทั้งหมดทำงานในเครื่อง
หากต้องการดูการดำเนินการนี้ให้ตั้งค่าสถานการณ์ง่ายๆที่เซิร์ฟเวอร์มีฟังก์ชั่น "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
เนื่องจากฟังก์ชั่นระยะไกลอาจใช้เวลาสักครู่เราสามารถห่อหุ้มด้วยเสื้อคลุม async และเรียกโทรกลับของเราเมื่อเสร็จสิ้น:
?> 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 klongpyเลือก binary prebuilt แบบ cupy ของคุณหรือจากแหล่งที่มา หมายเหตุการสนับสนุน ROCM สำหรับ Cupy เป็นการทดลองและน่าจะมีปัญหา
'cupy' => สร้างจากแหล่งที่มา 'cuda12x' => "cupy-cuda12x" 'cuda11x' => "cupy-cuda11x" 'cuda111' => "cupy-cuda111" 'cuda110' => "cupy-cuda110" 'cuda102' "Cupy-ROCM-5-0" 'ROCM-4-3' => "Cupy-ROCM-4-3"
pip3 install " klongpy[cupy] "pip3 install " klongpy[full] "Klongpy เป็น superset ของภาษา Klong Array ปัจจุบันผ่านการทดสอบการรวมทั้งหมดที่จัดทำโดย Klong รวมถึงห้องสวีทเพิ่มเติม
เนื่องจาก Cupy ไม่เข้ากันได้ 100% กับ Numpy จึงมีช่องว่างบางส่วนใน Klongpy ระหว่างสองแบ็กเอนด์ โดยเฉพาะอย่างยิ่งสตริงได้รับการสนับสนุนในอาร์เรย์ Cupy ดังนั้นการสนับสนุน GPU ของ Klongpy ในปัจจุบันจึง จำกัด คณิตศาสตร์
งานหลักอย่างต่อเนื่องรวมถึง:
Klongpy เป็นภาษา Klong อย่างมีประสิทธิภาพ แต่มีความแตกต่างที่สำคัญบางประการ:
git clone https://github.com/briangu/klongpy.git cd klongpy python3 setup.py พัฒนา
python3 -m unittestขอบคุณมากสำหรับ Nils M Holm สำหรับงานของเขาที่ Klong และจัดหาฐานรากสำหรับโครงการที่น่าสนใจนี้