11 ms·
KlongPy: High-Performance Array Programming in Python
- bbstats 2y ago[flagged]
- deleted 2y ago[deleted]
- solidsnack9000 2y agoI gather where it says `:monad` it is referring to an operation that had an effect on the interpreter state?
- Pompidou 2y agoNo. In APL deriverd array programming languages, verbs (or functions) are monadic or dyadic : they accept only one or two arguments : In '1 + 1', + is a dyadic operator, while in 'exp 5', exp is monadic. In J, and in APL I guess, left arg is usually understood as 'control data', while right arg is the data upon which calculation is done. Left argument is usually left unchanged after calculations. In this way, is it possible to create multi-arguments verbs, by placing boxed args on the left of the verb.
- itishappy 2y agoIt sounds unrelated to the monads popularized by Haskell tutorials. Naming coincidence or am I missing something?
- odo1242 2y agoNaming coincidence, they are in fact unrelated.
- deleted 2y ago[deleted]
- skruger 2y agoAPL's use of 'monad' predates Haskell's existence by decades.
- 082349872349872 2y ago...and Leibniz's "windowless monads" (all three concepts are pairwise distinct, related solely by the greek prefix for 'single') predates APL and Haskell by centuries.
- solidsnack9000 2y agoA `monad` in Category Theory (which is where Haskell gets them from, ultimately) is a single-argument functor and two natural transformations, so there probably is a through-line here in terms of one-argument function-likes.
- solidsnack9000 2y agoThanks kindly.
- snthpy 2y agoUnfortunate naming coincidence which is confusing. Couldn't we just call those unary and binary operators rather?
- incrudible 2y agoNaive array programming is not really high performance in my book, because performing a lot of trivial arithmetic on large arrays leads to poor locality and high bandwidth pressure. The better alternative is SPMD, i.e. something like CUDA or ISPC for CPUs. This is possible with some type of JIT if the numpy style of programming is to be maintained, for example tinygrad.
- cl3misch 2y agoIf you like high-performance array programming a la "numpy with JIT" I suggest looking at JAX. It's very suitable for general numeric computing (not just ML) and a very mature ecosystem. https://github.com/jax-ml/jax https://github.com/jax-ml/jax
- deleted 2y ago[deleted]
- CyberDildonics 2y agoYou are absolutely right, naive array programming might be much faster than raw python but it will never be high performance because you can't use caches and memory bandwidth effectively.
- bunderbunder 2y agoThe unstated major premise here is that you're working with data that's big enough that this becomes your major bottleneck. There's also a subset - possibly even a silent majority - of problems where you're doing fairly intensive calculation on data that fairly comfortably fits into a modern CPU cache. For those, I'd still expect SIMD to be a great choice from a performance perspective.
- CyberDildonics 2y agoI'm not exactly sure what this means, but the bandwidth to the level 3 cache isn't actually more than memory. If you only have a few megabytes to work with, it's a lot less likely performance is going to matter anyway, and if it does you would still want to do multiple operations on each array item if possible, because if you put a few more lines in a loop you're talking about registers at that point, not cache.
- kstrauser 2y agoThis is awesome. I’ve wanted to play with array languages before but they tend to be kind of a pain in the neck to start with locally. I like the idea of hacking my way around in the new language while keeping a Python escape hatch close by in case I haven’t yet learned how to do a thing the new way. Nice.
- MPSimmons 2y agoI thought I knew python, but then I saw this: ?> sum::{+/x} :" sum + over / the array x :monad ?> sum([1 2 3]) 6 ?> count::{#x} :monad ?> count([1 2 3]) 3 What?
- deleted 2y ago[deleted]
- asloan23 2y agoSorry if this is a dumb question, why is this weird in Python? I use R as my main language and this is exactly how I would expect it to work. Does Python not do this naturally?
- faizshah 2y ago> sum::{+/x} > count::{#x} These two expressions are not valid in R or Python. They are implicitly declaring a function without declaring the arguments, it is implicitly iterating over the array and returning the result (all features of array languages to make it more concise). Python’s + and / are a function of two objects (dyadic) and are syntactic sugar (they can’t be treated as function values, thats what the operator module is for): https://docs.python.org/3/reference/datamodel.html#object.__add__ https://docs.python.org/3/reference/datamodel.html#object.__... The array languages optimize for concise code so a lot of things are done implicitly that are done explicitly in Python. The python equivalent: > _sum = lambda x : functools.reduce(operator.add, x) > _count = lambda x: functools.reduce(lambda acc, _: acc + 1, x, 0) Of course in python and R there are built ins for these already (sum(x) and len(x)) but this is just to show what array languages are doing for you.
- asloan23 2y agoOh I think I see what you mean. Yes I was thinking of the built-in functions of sum & length
- jofer 2y agoKlong is a different language than Python. Python using numpy would look broadly similar for the first few examples, yes. However, this is a way of executing a different language on numpy arrays. Array languages are a different paradigm. Klong is an array language, while Python + numpy allows some array paradigms, but isn't an array language. Notice how they're _defining_ the "sum" operation there. Instead of being something builtin, they defined "sum" as {+/x}. {+/x} is the interesting part. That's Klong. It's not being able to define a "sum" operation, it's that "sum" can be expressed as {+/x}. That's very different than both R and python.
- nils-m-holm 2y agoGood to see KlongPy thrive! It is based on Klong (http://t3x.org/klong/ http://t3x.org/klong/), which I do not maintain any more, so I am glad that Brian took over!
- wvlia5 2y agoHey, I read your yoga book today.
- nils-m-holm 2y agoGood to hear! I do more yoga than programming these days. :)
- amarcheschi 2y agoI'm gonna be the one who asks the dumb question, but someone has to do it: why are expressions evaluated from right to left?
- bear8642 2y agoBecause that's what APL does: https://www.jsoftware.com/papers/EvalOrder.htm https://www.jsoftware.com/papers/EvalOrder.htm It also simplifies things as no need to implement BIDMAS
- abrudz 2y agoThink "normal" call syntax like foo(bar(baz(42))) and then remove the superfluous parens foo bar baz 42 The expression is evaluated from right to left. Now, let's make two of the functions into object members: A.foo(bar(B.baz(42))) Remove the parens, extracting the methods from their objects, instead feeding each object as a left argument to its former member function: A foo bar B baz 42 This is normal APL-style call syntax; right-to-left if you want.
- amarcheschi 2y agoOh now I see it, it sorts of reminds me of lambda calculus
- RyanHamilton 2y agoThanks for asking. I would guess you're asking as someone that spent years learning math notations and being taught BODMAS operator precedence. The funny thing is that if you took a 3 year old child and taught them right to left it's actually more natural than multiplication before addition. Array languages often take a fresh first principles approach rather than regurgitating common learnings. This does mean programmers from other languages can find it more confusing than total beginners.
- behnamoh 2y agoWhat are some real-world practical applications of array programming? Because as far as I know, APL did not catch on, and its subsequent versions like J and K and BNQ also did not become useful in industry. Maybe there's something I'm missing. Why would you want to do array programming in Python? What are the advantages over regular Python programming?
- deleted 2y ago[deleted]
- fluorinerocket 2y agoI thought they had niche in finance.
- mlochbaum 2y agoAPL did catch on to some extent, see https://news.ycombinator.com/item?id=39471718 https://news.ycombinator.com/item?id=39471718 . Without getting into any discussion of the array paradigm itself, the reason commercial programming is such a winner-take-all system now is hiring and organizational difficulties, not that popular languages are so much more productive than unpopular ones. Building a working application is the easy part of running a business.
- itishappy 2y agoArray programming databases (eg: KDB+, Shakti) are (per their own metrics) way faster than the competition. Licensing fees are in the 6 digits, so I'm not comparing them personally, but people pay that exorbitant amount, and I assume they do so for a reason. https://shakti.com/ https://shakti.com/
- juliangoldsmith 2y agoThe array languages aren't super popular because of the sharp learning curve. They're a lot different than most other languages, and they have a lot of operators that simply don't exist in something like C++. A few years ago there was an article about K's use in high-frequency trading. I'm not sure about usage of APL and J, though. BQN is still fairly new, so it will take a while to see much production usage. If you've ever written code using NumPy, Tensorflow, or PyTorch, you're doing array programming. Those libraries are heavily influenced by the array languages, including taking a lot of terminology (rank, etc.). I've personally found that playing with J and BQN helped me understand Tensorflow, and vice versa.
- cturner 2y agoI would love something like duolingo, but for an array language. Not a steady series of challenging puzzles like leetcode sites, Rather, a series of questions with high repetition, somewhat like flash cards, easy to drop into for a few minutes.
- deleted 2y ago[deleted]
- aebtebeten 2y agoHave you tried following (working through) Iverson's Turing Award lecture? https://dl.acm.org/ft_gateway.cfm?id=1283935&type=pdf https://dl.acm.org/ft_gateway.cfm?id=1283935&type=pdf
- abrudz 2y agoSee https://github.com/Isaac-Flath/anki https://github.com/Isaac-Flath/anki and https://github.com/aeamaea/APL_Anki_Decks https://github.com/aeamaea/APL_Anki_Decks
- eismcc 2y agoKlongPy author here: AMA
- sevensor 2y agoWould it make sense to think of this as a compact syntax for numpy? When it comes to array operations, are there differences that go deeper than the syntax?
- eismcc 2y agoKlongPy has a lot of other features beyond pure NumPy operations (such as IPC and web server), which you could see as a kind of making use of array operations in some application. You could look at the core Klong language as what you suggest.
- Qem 2y agoOn Linux rlwrap is used to get the REPL working. Is possible to get the REPL working under PowerShell in a Windows box too?
- eismcc 2y agoI don’t use windows so not sure.
- jayavanth 2y agowhy are so many array programming alternatives to numpy/scipy popping up recently? Is there a fundamental flaw or showstopper in numpy?
- eismcc 2y agoNumpy is just the backend and KlongPy has a lot more application features than Numpy. You can see something like kdb+ as inspiration.
- tveita 2y agoIs the full rendered documentation available anywhere? https://github.com/briangu/klongpy/blob/main/docs/quick-start.md https://github.com/briangu/klongpy/blob/main/docs/quick-star... links to an "API Reference" and a "REPL Reference", but the links are broken.
- faizshah 2y agoI’ve tried several times to give J/k/Q/kdb a chance but I haven’t really found a convincing example why this approach is better than say SQL or say numpy/jax etc. The syntax has the same problem as perl in that you have to learn too many symbols that are hard to look up. And this combined with the tacit style makes it difficult to parse what the code is doing. I think ruby went in the radically opposite direction in that it provides a similar feature set to perl with similar functional features but everything is human readable text. I feel like there’s room for a human readable version of J that relies less on syntactical sugar. I do think the direction Klong has gone with the syntax is an improvement: https://t3x.org/klong/ambiguity.html https://t3x.org/klong/ambiguity.html I’m curious if anyone has a go-to article/example of why an array language would be a good choice for a particular problem over other languages? I know the second chapter of J for C programmers is kinda like that but I didn’t really find it convincing: https://www.jsoftware.com/help/jforc/culture_shock.htm#_Toc191734290 https://www.jsoftware.com/help/jforc/culture_shock.htm#_Toc1...
- ramses0 2y agoThere was a step-change improvement for me when I tried expressing some JS patterns via `underscore.js` instead of procedurally: eg: http://underscorejs.org/#each http://underscorejs.org/#each Thinking of something as `each | map | filter | sum` is waaay less buggy than writing bespoke procedural code to do the same thing. No doubt there is a "cost" to it as well, but the _abstraction_ is valuable. Now, if there were a "compiler" which could optimize that whole pipeline down and squeeze out the inefficiencies between steps because it could "see" the whole program at the same time. (oh, I don't know, something like `SELECT * FROM foo WHERE a > 100 AND b < 9000 LEFT JOIN bar ON ...etc...`) ...perhaps you could get both an expressivity gain (by using higher level concepts than "for" and "while"), a reduction in bugs (because you're not re-implementing basic work-a-day procedures), and an improvement in efficiency (because the "compiler" can let you express things "verbosely", while it sorts out the details of efficiency gains that would be tenuous to express and keep up to date by hand).
- faizshah 2y agoI 100% agree, I think the functional features that have been added across all the popular languages (map, reduce, fold etc.) has been a positive. Nothing demonstrates it better (imo) than purrr in R: https://github.com/rstudio/cheatsheets/blob/main/purrr.pdf https://github.com/rstudio/cheatsheets/blob/main/purrr.pdf I also think there is some merit to “high syntactical density” clearly if you can see the entire code in one place instead of having to navigate through many files or sections that’s beneficial. (Heavily discussed in the last big HN thread: https://news.ycombinator.com/item?id=38981639 https://news.ycombinator.com/item?id=38981639) I also think JQ has proven the merit of tacit functional languages in that you can concisely write arbitrary transforms/queries on json that can be more expressive than SQL (many SQL engines have added JSONPath anyway). And I also think postfix is great for processing pipelines. But I am not totally convinced in the approach of APL/J/Q/KDB for the combination of terse style + prefix + tacit because it makes the code so difficult to read. I think if you took an approach similar to JQ where instead of relying on symbols operators were just human readable words it would be easier to get us half way there to trying out the verb, adverbs etc. approach of the APL family. The problem with making it human readable text is that you lose the conciseness which is part of the draw of the APL family as they want to have a high syntax density and analogous code to mathematical expressions.
- dang 2y agoRelated. Others? KlongPy: Vectorized port of Klong array language - https://news.ycombinator.com/item?id=35400742 https://news.ycombinator.com/item?id=35400742 - April 2023 (8 comments) Klong: a Simple Array Language - https://news.ycombinator.com/item?id=21854793 https://news.ycombinator.com/item?id=21854793 - Dec 2019 (73 comments) Statistics with the array language Klong - https://news.ycombinator.com/item?id=15579024 https://news.ycombinator.com/item?id=15579024 - Oct 2017 (12 comments) Klong – a simple array language - https://news.ycombinator.com/item?id=10586872 https://news.ycombinator.com/item?id=10586872 - Nov 2015 (21 comments)
- ktm5j 2y agoNot everyone has read everything that's ever been posted to HN. There's some utility in reposting, which I think is evident based on how many upvotes this has gotten. I'd never seen this and I'm here almost every day. If you've already seen this, and aren't interested in another look then just move on.
- solumunus 2y agoThey’re posting related discussions so that interested readers can read further.
- RestartKernel 2y agoI've been meaning to give something APL-ish a shot, but I don't see how such languages can be justified in a non-academic engineering environment. I doubt any company would like to limit themselves to hiring programmers who are capable of maintaining such code.
- deleted 2y ago[deleted]
- navyasingh96 2y ago[dead]
- navyasingh96 2y ago[dead]