[HN Gopher] Why I'm still using Python ___________________________________________________________________ Why I'm still using Python Author : japhyr Score : 110 points Date : 2022-12-30 16:06 UTC (6 hours ago) (HTM) web link (mostlypython.substack.com) (TXT) w3m dump (mostlypython.substack.com) | password4321 wrote: | I continue to reach for Python first for my personal scripting, | especially gluing together existing libraries. | | Building tools multiple people will be using regularly? Might be | worth speeding up at least the slow parts with another language. | (I don't know it well enough for it to by my first choice here). | | Also: I appreciate typed languages more when working with a team. | I'm not familiar with the options Python offers to keep teams on | the same page. | worik wrote: | I had to install Mailman 3 a while ago. | | It would not run on a $5 VPS from DO, because to deploy it | required more memory (two gigabytes I think... meh). | | Mailman 1 ran in 40K. It was written in Perl. Clunky, not flash, | and functional. | | Mailman 3 is written in Python using Python tooling - Django I | believe. | | Clunky, flash, and functional. And costed my $5 a month extra. | | I do not hate Python, I forgive the language for people misusing | it. But it is a _scripting_ language. That is what it is good | for. Calling other systems. Not building the tight loops | [deleted] | KyeRussell wrote: | It's easy (and common) to point to Instagram et al as examples | of people using Python and even Django at scale. Beyond those | big hitters though, Python is obviously a very popular | language, and Django is a very popular web framework. The | people making these tooling decisions aren't just noobs. Python | and Django obviously meet the functional and performance | characteristics desired by a lot of people. | | I have Django projects, some of which I am going to assume are | more complex than Mailman, using far less than two gigabytes in | production. Not through any extreme optimisation efforts. It's | just...what's happened. In my experience, the resource | footprint you experienced with Mailman is not representative. | | Notwithstanding the fact that we've seen amazing performance | improvements in Python as recently ad 6(?) months ago, if speed | were my primary concern, I am obviously not picking Python. | This doesn't mean that it should be relegated to the frankly at | this point outdated bucket of "scripting languages". The | language's features, performance profile, and package ecosystem | all surpass these use cases. The conventional wisdom, which I | completely agree with, is that these days things are good | enough that speed need not be a primary concern for most people | most of the time. Sure, oldschool Mailman was fast, but did | anyone want to or know how to actually work on it anymore? | Evidently not. | Simran-B wrote: | How popular would Python be without the scientific users and the | machine learning ecosystem? | | I have the feeling that its user base is pretty lopsided, but I | might underestimate its importance in other areas, like teaching | programming. I'd love to see a breakdown of its popularity by | field. | baq wrote: | > How popular would Python be without the scientific users and | the machine learning ecosystem? | | That's tail wagging the dog. 'Why Python became the scientific | computing language?' is the right question. | college_physics wrote: | This. Somebody should actually trace the milestones that led | to the current state as it not by any means obvious why it | happened. At some point a winner-takes-all dynamic obscured | some direct competitors like R or julia but prior to that all | bets were open. It could also have been c++, since libraries | like armadillo and eigen make it easy to write script-like | code. Or even java that is everywhere in enterprize | shanebellone wrote: | All the top tech companies use Python for product. | | Google | | Facebook + Instagram (largest deployment of Django) | | Spotify (millions of lines of Python) | | Netflix | | Reddit | | Dropbox (millions of lines of Python) | | YouTube | | Plenty more examples. | theCrowing wrote: | It's also the primary language used for everything regarding | VFX. Think Pixar, ILM, WETA, Disney etc. it's mostly inhouse | tools so nobody ever sees them but the code bases are huge | and are growing as fast as the demand for more and more high | quality VFX from streaming services and studios. | shanebellone wrote: | That's interesting. I wasn't aware of this. Thanks for the | share. | mihaaly wrote: | All those use dozens (hundreds?) of other tech for product | too. | | How is this an answer to the question? | shanebellone wrote: | "How popular would Python be without the scientific users | and the machine learning ecosystem?" | | ... do I really need to explain this? | rrdharan wrote: | Google / YouTube no longer use Python "for product", at | least, not in the serving path. Dropbox has also been moving | away and towards Golang. | | Instagram (Cinder), Google (Unladen Swallow) and Dropbox | (Pyston) have also all experimented with heavy engineering | investment trying to improve Python performance and only one | of them (Cinder) has outcompeted the "just rewrite it in a | faster language" strategy. | shanebellone wrote: | Also... | | https://devblogs.microsoft.com/python/python-311-faster- | cpyt... | solarkraft wrote: | I think it's a great pattern to start with Python and do | something once performance becomes a problem. You can | afford it when you're successful thanks to the code you | wrote in Python, or it won't be a problem anyway. | TillE wrote: | Very. Unless you're a diehard JavaScript head, it's still the | language of choice for smallish projects like a Discord bot, or | for any kind of sophisticated script. | buffalobuffalo wrote: | As of late, my "language" of choice is a mashup of python and | nim. I use python for the ecosystem and nim for parts that need | to run fast. It's the easiest interoperability I've ever worked | with. | marsupialtail_2 wrote: | I just find it funny how my post on why I wrote a SQL engine in | pure Python is right next to this one on the front page | atoav wrote: | One of _the_ single language features that makes me stay with | python is list comprehensions. So maybe something like that: | stuff = [cleanup(s) for s in stuff if s.unprocessed] | | This, the way you can handle/manipulate strings and the powerful | included libraries make python a good language. | | Downsides? Dependency managment, tooling, speed | cortesoft wrote: | I feel like this is a lot cleaner and more clear in Ruby: | | stuff = stuff.map {|s| cleanup(s) if s.unprocessed }.compact | nequo wrote: | Only knowing Python and not Ruby, your snippet looks | confusing to me. | | 1. What does the anonymous function return if s.unprocessed | is false? | | 2. If it returns nothing, do I get a missing value element in | the iterable that results from map? | | 3. And what does it mean to compact the result of the map | call? | | The Python snippet raises none of these questions in me. But | it could be because I am familiar with Python's quirks. | cortesoft wrote: | The compact gets rid of all the null values returned when | unprocessed is false. | | Interestingly I wasn't exactly sure what the python code | would do, which is why I used the compact. In the python | code, does 'stuff' end up only having the result of the | cleanup function for items that are unprocessed? Or will it | have all of the items, and the ones where unprocessed | returns false just end up being returned unmodified? | | My Ruby version returns the processed subset of items that | were unprocessed. The python version was not clear to me, | since I don't know what happens if s.unprocessed returns | false. | | So basically, it sounds like we were both confused by the | same parts of the language we are unfamiliar with... what | happens to elements where s.unprocessed is false? It was | clear to me that in Ruby it returns a nil, but I have no | idea in Python... what happens? | nequo wrote: | Huh, our mutual confusion is interesting indeed! Thank | you for teaching me something about Ruby. What compact | does makes sense. | | Python's list comprehension combines map and filter. | [process(s) for s in stuff if s.unprocessed] | | is equivalent to map process (filter | isUnprocessed stuff) | | in Haskell. | baq wrote: | Nothing, literally. This is map+filter optimized (or a | for+if+append but using dedicated opcodes for efficiency) | so you don't have to do multiple passes and/or create | temporary lists with superfluous elements. | snowpid wrote: | List Comprehension is just syntax for functional coding | (filter, map) but a very good one! | ogogmad wrote: | Being pedantic: This isn't true in Haskell, because list | comprehensions can use pattern matching, while map+filter | can't. heads :: [[a]] -> [a] heads xs = | [y | (y:ys) <- xs] -- heads [[1],[],[2,3]] == | [1,2] | | Doing the above using maps and filters looks very different: | heads' = map head . filter (not . null) | | Python doesn't really support Haskell-like pattern matching, | so the above doesn't apply. | ulucs wrote: | The thing you're looking for is easily found with a Hoogle | search for type (a -> Maybe b) -> [a] -> | [b] | | Which yields mapMaybe: https://hackage.haskell.org/package/ | base-4.17.0.0/docs/Data-.... so you end up with | heads = mapMaybe safeHead | pdonis wrote: | _> Python doesn 't really support Haskell-like pattern | matching_ | | It does as of 3.10: | | https://peps.python.org/pep-0622/ | | Not as sophisticated as what Haskell can do, I'm sure, but | I think it's a good addition to Python. | von_lohengramm wrote: | I may be the outlier here, but I have a very hard time | _comprehending_ list comprehensions. They 've always seemed | like a SQL query compressed into a single line (or two if | you're lucky!): readable when it's simple, Lovecraftian when | it's not. I've always found the functional pipeline style | much more readable and much easier to explain to others, | especially with IDE type hints. | maxbond wrote: | IMHO the key to legible comprehensions is to use them only | to express composition and to put the logic into verbosely | named functions. | | Chained pipelines (`foo.filter(...).map(...)`) are fine to | me, certainly more verbose then comprehensions for better & | worse, but I get lost in pipelines expressed as nested | functions (`map(filter(a, ...), ...)`). | dragonwriter wrote: | > they've always seemed like a SQL query compressed into a | single line (or two if you're lucky!): | | If its more than a very simple expression, with one simple | for, and no if or very simple if, I try to use at least | (more, with parens, if necessary): one line for the result | expression, one line for each for clause, and one line for | each if clause. | | But, while the boundary is subjective, it doesn't take much | before functional pipeline style is clearer (Python lambdas | being more limited and syntacticaly cumbersome, functional | pipeline style isn't as clean in Python as it is in other | languages, though.) | int_19h wrote: | SQL queries _are_ sequence comprehensions! | | Python comprehensions in particular are unfortunate because | the flow of the query, like in SQL, is not linear - the | projection part is written first, but happens last. Thus, | reading a non-trivial query requires moving back and forth | to resolve the references. | | Compare that to C# LINQ, which is also a kind of sequence | comprehension. That one not only has linear syntax where | the data flow in the query is strictly left to right, but | it's explicitly defined by mapping it to functional | pipeline style. Thus, it ends up being a strict improvement | on the latter. | | (Another example of "good" sequence comprehensions in this | sense is XQuery FLWOR) | pharmakom wrote: | Sorry, but Python list comprehensions are not very good | compared to other languages. | curiousgal wrote: | C#'s LINQ is far more powerful in my opinion. | matsemann wrote: | I have a completely opposite reaction, one of the things I hate | the most with Python is its list-incomprehensions. They quickly | become hard to read and very imperative, instead of | declarative. Something like | stuff.filter(it.unprocessed).map(cleanup(it)) conveys the | intention behind each statement a hundred times better. And | list comprehensions becomes impossible to reason about once | they involve flatmapping or other relative _simple_ functional | expressions. | MrVandemar wrote: | Definite agreement. I started a long time ago with Python2, | and what attracted me was how simple and readable the syntax | was. | | With Python3 there is a move towards "idiomatic" Python code, | which to me means moving away from clear and concise to the | old programmer trap/readability nightmare of "look how many | things I can get it to do with one line of code!" | sodapopcan wrote: | I agree very much so. List comprehensions and can be nice and | concise and readable in many situations, but due to the whole | "one true way" thing in Python, they're used in every | situation, even when a map/reduce/filter etc would be better. | Although since there are no pipes, I sorta get it. | spicyusername wrote: | I almost always prefer to read nested loops and conditionals | than list comprehensions. | | I find the syntax of list comprehensions ugly and inscrutable. | xvedejas wrote: | Additionally I find that it's easier to add complexity to the | loops; once you want to start doing nontrivial things in a | list comprehension, you often need to rewrite it into a loop | first anyway. | sodapopcan wrote: | List comprehensions are great but certainly not unique to | Python. | solarkraft wrote: | Python is pretty decent for small to medium sized stuff where | performance isn't a big issue (setup stuff, simple backends, | ...). A lot of stuff falls into that category. | | I especially enjoy the types. Coming from Typescript and being | quite a fan of the "dynamic language with optional typing" | pattern it was quite cool to find that Python just has that. | | Sadly quite a few pieces of software are likely going to stick | with Python 3.7, so we are probably going to have to stick with | the old syntax (explicit imports from typing and uppercase types) | for a long time. | college_physics wrote: | Python has only one really serious drawback for the kind of tool | it is and its not remotely its own fault: its not a first class | resident on mobile. | | In a different universe its sweet easygoing manner would have | created enormous value by enabling all sorts of casual | programmers to have some control over this most ubiquitus of | computing devices. | | Alas we dont live in an era where tech aims to empower users. | | NB: There are a number of projects that allow some of this (kivy, | beeware) but they need to swim hard against the current. | pharmakom wrote: | The main drawback of Python is the limited set of language | features. | KyeRussell wrote: | This is how we end up with another Swift. | ugh123 wrote: | and those are....? | college_physics wrote: | Most developers need to have at least two languages at their | fingertips, so none of them needs to be perfect. What is | important is to a spanning set for all the use cases that are | relevant to you. | | I think if we switch from endless arguments about best | languages to the optimal _pairs_ of languages we 'd book huge | gains (and less online noise :-) | sigmonsays wrote: | all the reasons i switched away from python (ranked most | important to least) 1. packaging python is awful. Turning a large | python code base into a deb is awful. I mean really, how many | _different_ setuptools or pip do you really need? 2. not strictly | typed. Really impedes large code refactors 3. not concurrent. The | concurrency primitives are a joke compared to any other language. | The GIL kills everything. 4. slow. Python gains all it's | performance by doing the important parts in C | | python is not a good fit for anything I do these days | baq wrote: | Good decision to move away. Tools are supposed to help, not get | in the way. Though types are there, opt-in, and who cares if C | modules make it fast if the end result is fast? | submeta wrote: | Been using Python for over 15 years, and although there are many | programming languages that I find way more attractive (Lisps and | functional programming languages), I keep sticking with Python, | because you can learn it very quickly, you have a vast amount of | resources and a large community that'll help you, and there is | nothing you cannot do with it: From Webdev to data analysis to | machine learning, there's a module for almost everything you need | to solve. | | (Edited ;) | 9dev wrote: | ...those ChatGPT responses are getting old real fast by now. | flashfaffe2 wrote: | Exactly what I thought reading the comment. | [deleted] | xwowsersx wrote: | Good post. I think this is the mature and somewhat inevitable | lens through which to assess which programming language you're | using. I have been using primarily Python for the last ~4 years | or so. It's probably the most boring language I have ever used | (it probably doesn't help that I've used Scala, Haskell, Rust, | etc). | | Obviously, some languages are better than others for specific | use-cases and one should think through the strengths and | weaknesses of each before beginning a new project (assuming you | expect the project to have some longevity). Similarly, it | definitely _is_ possible to make the wrong choice about which | language to use. But even as a PL "enthusiast", I've learned | over ~15 years of leading successful projects and teams, that | evaluating languages is always team/org/business-dependent and | the considerations that factor into those contexts are distinctly | different from the kind of considerations that I, as a PL | enthusiast (and I suspect many others in the HN crowd) would | prioritize. You have to consider things like: | | 1. What stage in the business in, i.e. early stage where you may | simply want to get something, _anything_ working and it 's viable | to do so in whatever language will get you there fastest (warts | and all, tech debt be damned, etc) vs the critical juncture where | you're beyond finding product-market fit and you now have a | business that is working and you need to increasingly focus on | reliability, scalability, etc? | | 2. What does the pool of engineering labor in the market you have | access to look like? For example, it may be the case that you'll | have difficulty, for one reason or another, finding developers | who work with language X, but could easily find many who can work | with Y (of course, good devs should theoretically be able to ramp | on any language, but whether you'd want them to do depends on how | crucial using that particular language is to your venture, | whether you can afford the ramp-up time, etc. | | 3. Also somewhat related to the quality of engineers you have | access to, the community/packages/ecosystem surrounding the | language may matter a lot to such a degree that even if some | other language were a better fit from a purely technical | perspective, it may leave you to have to fend for yourself in | ways that your team simply isn't up for. | | .. and many more considerations. | | Beyond all of this, I resonate with the author's orientation of | wanting the language to just get out of the way. Sometimes you're | looking to geek out on a stimulating and interesting language. | Other times, that's the last thing you're thinking about. Bonus | points if the language you find most compelling is also the one | that, for reasons like the ones mentioned above, is the one that | makes the most sense for you and your team. All in all, the point | is that assessing a language in isolation, without any regard for | what you're actually trying to accomplish, what your team looks | like, etc. doesn't make much sense. | | Side note: I do wish more Substack authors would allow comments | even from non-paid subscribers. I could understand restricting it | if you already have an established paid subscriber base and a | chatty comments section. But if comments are non-existent, it | seems to me like the author is potentially losing out on valuable | feedback/commentary by restricting commenting to paid | subscribers. | pugio wrote: | I've been thinking (and researching) heavily in preparation for a | new (offline, desktop) app I want to build. The app has a lot of | data wrangling, and probably a decent amount of ML. Python seems | like the logical choice, but... | | I've written a lot of Python, taught classes in it, deployed | production code... and I still feel a semi-conscious urge to | reach for something else whenever I contemplate starting a new | project. Something about its approach, syntax, common idioms, | always feels just a tad clunkier to me than I'd prefer. The | whitespace makes it hard to paste lines into my repl, and | (probably the biggest thing) comprehensions ARE NOT SUFFICIENT | replacements for easy anonymous inline functions (JS () => , or | Ruby's blocks). | | I like dynamic languages, I really like the advances in tooling | with type checking and LSP support. I like dynamic notebooks | (either inline in VS Code #%%, or straight Jupyter), the massive | package ecosystem (but obviously hate the actual packaging | tools), cool tools like Rich... but it just doesn't make me as | happy to use as other languages. | | I'm still trying to articulate why. Maybe I was just ruined by | learning Ruby first. | pphysch wrote: | Unless you have a clear specification for what you are going to | build (as in, you have most of your data schemas and processes | sketched out), stick with Python and benefit from the | development velocity as you figure things out. | | Then rewrite it later when you need to scale. | nnadams wrote: | I have embraced this workflow completely. I used to be more | concerned about which language, but now I find I much more | useful to just start immediately in Python. I spend most of | the time working out the kinks and edge cases, instead of | memory management or other logistics. Maybe ~75% of the time, | that's it, no need for further improvement. | | Recently I chose to rewrite several thousands of lines of | Python in Go, because we needed more speed and improved | concurrency. Already having a working program and tests in | Python was great. After figuring out a few Go-isms, it was a | quick couple of days to port it all for big improvements. | alar44 wrote: | This is what I do. Hack it together in Python to get | something running, then rewrite everything in C++. | JonChesterfield wrote: | This works especially well if you test the python version | as you go, then run the same python tests against the C++ | replacement. The up front bother of pybind or similar is | minor relative to not having to recompile the C++ to | iterate on test scripts. | devoutsalsa wrote: | Elixir is nice is you are looking for something new to try. | jamal-kumar wrote: | I recently discovered it. It's pretty amazing for how | incredibly easy it is to build distributed applications with | it, that is the part which impressed me the most. It handles | concurrency well for sure but same program seamlessly across | multiple computers is just awesome. I know it's basically | just taking this functionality from being built on top of | erlang already but it's still very impressive. Plus like | crystal if you already know ruby, having tried to base it's | syntax on it, it's an easy thing to pick up if you can grasp | the functional aspects too. | yason wrote: | Python is a good language and I use it a lot. But I can only say | Python2 was fun but Python3 is serious. I could live with the | quirks and shortcomings of Python2 and still enjoy programming. | But even after a decade of history I still find many of the | things unenjoyable that Python3 decided to introduce. I know why | they did it, it's not an intellectual complaint. It just | describes the feeling of starting a new Python program. Used to | be great fun. Nowadays, merely a technological compromise. | analog31 wrote: | I'm strictly a "scientific" programmer. I've used multiple | languages in 40+ years, but only two lasted more than a decade: | Turbo Pascal and Python. As Python has passed the decade mark for | me, I sometimes wonder why I'm still using it and what would make | me get sick of it. | | Some of my reasons for choosing Python in the first place have | been mooted. Python is free, and multi-platform, but so is | everything else nowadays. I think that battle is over. | | For my use, packaging has not been a big obstacle, maybe because | I tend to use a relatively small handful of established packages. | I don't remember needing a package that I couldn't install with | pip. | | Easy to learn? Yes and no. I think a beginner can ease their way | into Python and get productive, if they start with basic | scripting and progressively adding a few language features. On | the other hand, some features are simply over the heads of | beginners, making the code found in packages practically | unreadable. But I've never found any language to be better in | this regard. | | Fast? Sure, with numpy in its domain of use. Or writing your own | C libraries. However, I think a beginner using numpy will run | into roadblocks that require help from an experienced programmer, | who can visualize what the array operations are doing under the | hood. So, writing fast code isn't easier to learn in Python than | in any other language. | | The editor should have a final option, that turns your code brown | if it's just so bad that nobody should ever have to read it, | including yourself. | 6gvONxR4sf7o wrote: | Another big one that many languages treat as table stakes these | days is the whole 'batteries included' thing. Whenever a new | language comes out and I have to make my own (or install) core | capabilities, it feels like a huge waste of time. | analog31 wrote: | Having to piece together a Python installation can be an | annoyance for a beginner. I always offer to help them set | things up the first time. Since most of my workplace is on | Windows, it's easy to have people install WinPython. | | This is especially true if they've already tried setting | things up, and have made a mess of it. Because WinPython is | self contained, it can work on a computer that already has a | working or non-working Python installation. | donkeybeer wrote: | What do you mean by piecing together a python install? Most | linux should have one pre-installed or easily available via | the package manager. After that venvs and pip seem to be | generally enough for most tasks. | ghshephard wrote: | I've been using Python for about 6 years, my last company | wrote it's core commercial product exclusively in python. | I've never used venvs, but I've yet to run into a | situation where virtualenv (maybe with virtualwrappers as | sugar), and pip + requirements.txt haven't been able to | handle even fairly complex install situations. | analog31 wrote: | My workplace is a Windows shop. I'm multi platform, but | by and large the folks using Linux don't need my help. | ;-) So when I help people its almost always on Windows. | blensor wrote: | I think one big factor is easy entry but almost no limit: | | Like BASIC back in the day it's a language that allows | newcomers to do things long before they are comfortable with | the added syntax requirements of C based languages | | Despite that the sky is the limit, almost all problems a | developer will encounter can be tackled with python. Yes for | many problems there are languages that are better suited for | the task, but in most cases a project does never even reach a | state where that will matter. | | And it's installed by default in many Linux distributions. | abdullahkhalids wrote: | I now use python, but Python is not even half the language | Mathematica is for scientific computing. | | If only Mathematica was free, I think it would become the | defacto language for scientists. | | The most important feature of Mathematica is that it is | functional and not object-oriented. Mathematics is functional, | not object-oriented. So thinking in Mathematica is as easy as | thinking in maths. Thinking in python is to force yourself to | think in an unnatural way. | klyrs wrote: | > Mathematics is functional, not object-oriented. | | I beg to differ. If by "math" you mean arithmetic and | calculus, then sure. Combinatorics, graph theory; probably | most of discrete math is very much object-oriented. | Heston wrote: | How does the speed of Mathematica compare to python or C? | pharmakom wrote: | There is Octave and Julia | baq wrote: | Mathematica is so much more it's hard to even describe. | It's free on a raspberry pi, so if you have time and access | to hardware, take a look. | jrumbut wrote: | I think the so much more/hard to even describe is sort of | a problem? | | There is a lot to it, and in my experience it's a very | long road to getting your first problem solved. | | There are a lot of very cool pieces but I want it to be | something I can pull off the shelf once in a while and be | productive rather than something that I need to be an | expert in before I can get started. | cycomanic wrote: | I think you're regarding Mathematica from a purely | "theory/analytics" point of view, however I think you're | missing the fact for a lot of scientific computing you want | to interact with other things apart from numerics/analytics | etc.. I believe that is really where Python shines and why | it's also eating Matlab's lunch (more so than Mathematica's). | It's incredibly easy to write a gui to interface with e.g. a | scientific instrument do some reasonably fast analytics with | numpy and possibly even produce publication ready plots. This | is not really possible with Mathematica and while you can do | this in Matlab, you need several toolboxes which are | expensive, but more over are of extremely varying quality | (let's not even talk about the horror of writing GUIs in | Matlab). With Python, you have all of that for free, with a | single tool (remember most scientists don't want to learn | lots of programming languages). | prepend wrote: | > If only Mathematica was free, I think it would become the | defacto language for scientists. | | Of course. It's one of the few languages that I think are | worth it. | | I've been waiting for Wolfram to open source it for 10 years | as I can't afford it, or really justify why my org should use | it. | pdonis wrote: | _> The most important feature of Mathematica is that it is | functional and not object-oriented._ | | Python has object-oriented features but there is nothing that | requires you to use them; you certainly don't have to express | every Python program in terms of classes and methods, the way | you do in Java. Doing functional programming in Python is | common. Is there a particular aspect of doing functional | programming in Python that you find to be a roadblock? | deafpolygon wrote: | Is JavaScript worth looking at, as an alternative to Python? | baq wrote: | As an alternative for web apps, yes. In other domains, not | really, but it'll work, it just doesn't solve any problem | better except it isn't Python. | jeremyjacob wrote: | You might look at Deno[0] which provides that scripting | language experience, similar to python. | | [0] https://deno.land | rkwertz wrote: | This language seems to require at least one positive front page | post per day so people keep using it. Compare with the anti- | golang posts today. | candrewlee14 wrote: | Python does a great job at putting together powerful scripts | quickly. But I have a really hard time opening up a big Python | codebase and making sense of it quickly. No static types can make | data pretty hard for me to follow. This may just be something I | need to improve at, but I have a distinctly better feeling | working with unfamiliar code with static types. Python makes me | feel I'm at the will of the documenter to be informed, whereas | the types self-document in many cases in other langs. | cycomanic wrote: | I think this is actually a big difference between SWEs and | programmers who are scientists/data scientists/analysts etc. | first. In my experience, people with more formal education in | programming find type systems to be very helpful, while people | from other backgrounds, find them confusing and an nuisance. | Barrin92 wrote: | I think that's a take in the category of 'you don't want types, | you want better names'. | | Static types are very useful for compilers but looking at a | function and seeing int -> int -> int -> string -> bool -> int, | says very little about the semantics of a program. It's | _always_ the names and documentations that tell human beings | how to make sense of a program. | | When we put things in record types, the sense-making value | isn't in the static analysis but in the fact that our vague | collection of parameters now has a proper name that indicates | what it's all about. | dragonwriter wrote: | > Static types are very useful for compilers but looking at a | function and seeing int -> int -> int -> string -> bool -> | int, says very little about the semantics of a program. | | Sure, but on the other hand a type of APIProxyEvent -> | LambaContext -> APIGatewayProxyResponse says quite a bit more | about the semantics. | | Unless a function is highly abstract, int -> int -> int -> | string -> bool -> int is probably an underspecific type | signature. | | EDIT: To be clear, I generally find that the thesis "you | don't want types, you want better names" comes from assuming | _bad_ types, and suggesting replacing them with _good names_. | And, for casual inspection, yes, good names may be superior | to bad types. On the other hand, I can't statically check | good names, I can statically check types (good types, or bad- | because-underspecific types, but good types, as well as | telling me more as a _reader_ , will also statically catch | more possible errors.) Ultimately, what I want is good types | _and_ good names, | ruuda wrote: | Python has optional type annotations. Most new code tends to | have them, and they help tremendously navigating and | understanding large codebases. | lordgroff wrote: | It's a far cry from an actually typed language. I like Python | and deal with its code bases for a living, but frankly it has | gotten too big for its britches. | The_Colonel wrote: | It's honestly not very good compared to a "real" type system | (platform). I've used it about a year ago for a couple of | projects, and it was painful and ultimately not very useful | exercise. | depressedpanda wrote: | While I agree that type hinting by its very own nature | feels a bit bolted on, I vastly prefer going into code | bases which include type hinting. I personally always add | type hinting to the code I write, as I actually consider it | quite useful. | | In what ways do think it's painful? | The_Colonel wrote: | I remember mypy being slow and buggy. I remember one mypy | upgrade broke all our builds because they changed some | type of resolution thing. IIRC after some outcry they | backtracked and started providing some migration path. | | The other thing which rubbed me the wrong way was that | the python was happy to run the code with completely | wrong type hints. | | I guess I went into it with wrong expectations, even | though it says right in the name - it's "type _hints_ ". | The whole experience felt more like a formalized | documentation with partially working optional | verification (which can't really be relied upon). | icedchai wrote: | Type hints are basically for documentation and metadata. | You also find a bunch of third party libraries and | frameworks, like pydantic, fastapi, etc. that makes use | of them. | baq wrote: | It's as real as typescript... not useful for code | generation or optimization, but very helpful for | correctness. | ruuda wrote: | I've used Mypy since 2016 on big as well as small | codebases, and it has been extremely useful for me. It | caught numerous bugs at typecheck time. The benefits of | better readability and e.g. better jump to definition and | autocomplete are harder to quantify, but subjectively they | feel substantial. If you are gradually annotating a big | codebase, it does require a "critical mass" before types | start to pay off, I agree that adding them later can be | painful. | | Mypy's type system is quite advanced compared to some | statically typed language like C and Go; it has generics, | union types, inference, and it can prove properties of | types from control flow. I work mostly in Rust, Haskell, | and Python, and I rarely find Mypy limiting. | | You do have to embrace types though; if you have a dictly | typed program where everything is a Dict[str, Any], then | putting that in annotations isn't going to be very helpful; | converting the dicts to named tuples or dataclasses is. | dragonwriter wrote: | > Python has optional type annotations | | Moreover, it has static type checkers with varying degrees of | support for type inference. | dang wrote: | This was also discussed in the last day: | | _Breaking up with Python_ - | https://news.ycombinator.com/item?id=34177703 - Dec 2022 (172 | comments) | velcrovan wrote: | So, the reasons are: | | * I've been using it for a long time | | * I have lots of friends that use it | | * Even though I'm interested in other languages I don't have time | to learn them | | These are all perfectly valid reasons! But, they say very little | about Python. | stabbles wrote: | They should put energy labels on programming languages. It's | convenient to use Python, but a waste of cpu cycles | [deleted] | rahen wrote: | If so, there would only be room for C and assembler. | | Give me at least ksh and awk, they don't use much resources and | are infinitely handy. | duckmysick wrote: | Or to go one step further, phase out (outlaw) energy- | inefficient programming languages like we do with high-emission | cars. | | I'm not advocating for it, but it's an interesting thought | experiment. | nnadams wrote: | A group of researchers published a paper on this topic, "Energy | Efficiency across Programming Languages" [0]. They have tables | listing the relative energy usage and memory consumption. | | It's just one paper of course, but the energy results weren't | too surprising. C was the baseline. C++, Rust, and Java close | behind. Languages like C# and Go near the middle, and then | Python, Ruby, and Perl at the bottom for most energy used. | | [0] https://greenlab.di.uminho.pt/wp- | content/uploads/2017/10/sle... | awjlogan wrote: | This got a reasonable amount of attention, but it's not | particularly relevant. The example solutions would never be | written in pure interpreted Python - you would import numpy | and use the numeric functions from there, effectively using C | rather than Python. | heresjohnny wrote: | You seem to favor human brain cycles over CPU cycles. | Conversely, time spent on memory management and pointer | arithmetic is time that could've been used to add value to the | world. | alar44 wrote: | You don't "manage memory" unless you're writing C, and if you | think "pointer arithmetic" is hard, you're a beginner level | programmer. | jnsaff2 wrote: | Well for code that gets executed billions of times spending | more human cycles seems a fair trade off. For boring old | corner shop crud, maybe not. | heresjohnny wrote: | Most code isn't fire and forget though. Bugs occur, | requirements change. The human cycles are a perpetual | investment. And Python is simply very, very maintainable. | | I do agree that there is a point where the scale tips. I | wonder where that is, and what kind of application we're | talking about then. Many applications are at their basic | level old corner shop crud, really. | lylejantzi3rd wrote: | Why hasn't anybody created a more efficient version of Python? | Slap some static types on that baby, get rid of the heavy | runtime, and you've got a good start toward something special. | adsharma wrote: | https://github.com/py2many/py2many/blob/main/doc/langspec.md | | Reimplement a large enough, commonly used subset of python | stdlib using this dialect and we may be in the business of | writing cross platform apps (perhaps start with android and | Ubuntu/Gnome) | doodlesdev wrote: | There are more efficient interpreters and compilers, problem | is they don't work with the existing libraries. If you mean | another language, there is Lua for scripting purposes and | Julia for math stuff. JavaScript also exists, which despite | its fame it is actually MUCH faster than Python, and you can | even run it in a runtime such as bun.js and get even more out | of it. | | IMO the biggest problem is that the Python libraries | ecosystem is just too good to miss out on. I absolutely hate | Python but even I have to admit it is much easier to do some | stuff in Python compared to other languages simply because of | the libraries available to do basically anything you could | dream of. | ravenstine wrote: | Wouldn't surprise me if a subset of Python compiled to | asm.js would run faster in V8 than cpython. | JonChesterfield wrote: | Probably doesn't have to be a subset. Call back to | cpython for the really dynamic madness, much like a jit | tiers back out of machine code when assumptions don't | hold. | bombolo wrote: | But would this "subset of python" be actually useful? | | Once you break compatibility stuff doesn't work... and a | fast python that can't run my software is less useful | than a slow python that runs the software. | dragonwriter wrote: | > Wouldn't surprise me if a subset of Python compiled to | asm.js would run faster in V8 than cpython. | | I'm certain that there exists _some_ subset of python for | which this is true, but so what? | biomcgary wrote: | Python performance, both single core and concurrent, seem | to be its primary Achilles heel. However, Python is | unmatched for developer speed in compute heavy AI / ML | since it uses C, etc., under the hood. I don't really like | Python but it's impossible to avoid in data science because | you don't have to re-invent the wheel. | | Several languages have persisted beyond their natural shelf | life due to their library ecosystems. For a period of time, | CPAN was one of the best arguments for using Perl. More | recently, Java's ecosystem is also a pretty good reason to | use Java right now, even if you don't like the language. | | Languages seem to thrive early due to initial ease of use | (Python, particularly, but also relative uptake of Go vs | Rust), but can wane due to a thousand cuts (or sigils in | Perl's case). | lylejantzi3rd wrote: | > However, Python is unmatched for developer speed in | compute heavy AI / ML since it uses C, etc., under the | hood. | | John Carmack seems to think otherwise. | | > "That means that in the time that Python can perform a | single FLOP, an A100 could have chewed through 9.75 | million FLOPS" | | https://twitter.com/id_aa_carmack/status/1503844580474687 | 493... | cldellow wrote: | Am I missing something? | | The OP's comment is that while Python's native | interpreter is slow, Python code as a whole can still be | fast since people will delegate the hot spots to non- | Python libraries optimized for speed. | | To refute that, you linked to John Carmack quoting Horace | He saying that Python's native interpreter does CPU-based | math slower than a GPU. But...that's why people writing | Python use libraries to delegate math-intensive work to a | GPU, which is the OP's point. | rahen wrote: | That's the spot filled by Go, and previously Pascal. Native | code with good efficiency while still being fairly easy and | productive. | pphysch wrote: | Go and Python have a quite different set of strengths. | Python heavily leverages operator overloading and other | metaprogramming features that Go does not support (well). | | If you pick up Go expecting it to be a "more efficient | Python", you will be sorely disappointed. | bombolo wrote: | In my experience go's libraries are generally not so high | quality | pphysch wrote: | Hard to judge. In Python it's very easy to create nice | porcelain APIs for powerful frameworks because you can | hide complex behaviors behind operators. Imagine Pandas | or Django without overloaded access operators. | | This is not the case in Go. | kuang_eleven wrote: | Because it honestly doesn't matter most of the time. | | In the majority of use cases, your runtime is dominated by | I/O, and for the remaining use-cases, you either have low- | level functions written in other languages wrapped in Python | (numpy, etc.) or genuinely have a case Python is a terrible | fit for (eg. low-level graphics programming or embedded). | | Why bother making a new variant language with limitation and | no real benefit? | Simran-B wrote: | I would add high-volume parsing / text processing to the | list of bad fits for Python, although I'm not sure if there | are native extensions for the different use cases? | lylejantzi3rd wrote: | This perspective is a common one, but it lacks credibility. | | https://twitter.com/id_aa_carmack/status/150384458047468749 | 3... | baq wrote: | His code has had 16.6ms to execute since before a lot of | people here had been born. Of course Python is hopeless | in his domain. It's creator and development team will be | the first to admit this. | KyeRussell wrote: | You've posted this multiple times in this thread, and not | once has it been relevant to the point being made. You | are sticking your fingers in your ears and deferring to a | contextless tweet by a celebrity. | pdonis wrote: | John Carmack is hardly an unbiased source. | | In any case, if your program is waiting on network or | file I/O, who cares whether the CPU could have executed | one FLOP's worth of bytecode or 9.75 million FLOPs worth | of native instructions in the meantime? | cb321 wrote: | You may be interested in https://en.wikipedia.org/wiki/Cython | which was a fork of Pyrex which dates back to the very early | noughties. It is basically as you describe and even has a way | to "bypass the GIL" in extension modules. There is also an | easy way to create a "compiled script" using `--embed`. This | is essentially a gradually typed system [1] like the Common | Lisp `declare` facility. Cython even has a warning system to | tell you what you forgot to declare, and an annotated HTML | generator to highlight "more Python C API heavy" portions of | your code. | | Personally, I think going all the way to Nim [2] is more | satisfying than a "gradually typed" system, though. | | [1] https://en.wikipedia.org/wiki/Gradual_typing | | [2] https://nim-lang.org/ | nnadams wrote: | Nim [0] might be one similar example. Similar syntax as | Python and trying to be just as extendable as Lisp. | | [0] https://nim-lang.org/ | tlavoie wrote: | Also languages like OCaml, which while less known, are still | getting improvements all the time. This was an interesting | blog post series from a few years back: | https://roscidus.com/blog/blog/2014/06/06/python-to-ocaml- | re... | spijdar wrote: | There are several "close to python" languages like this, | actually, I remember one popping up on HN semi-recently. | | If you expand into just "kind of Python-like", you have | languages like Nim that approximately fill the hole of | "efficient Python". | | My impression, though, is a lot of the popular | frameworks/libraries for Python lean heavily on runtime | reflection in Python (e.g. Django). So people end up stuck to | the full Python interpreter/runtime. | Simran-B wrote: | I consider Ruby to be quite similar to Python. However, | it's kind of like Python's weird brother, with optional | parentheses for calls without arguments, auto-returning the | result of the last expression, and some odd-ball syntaxes. | It manages to be even less efficient, though. | quesera wrote: | As someone who probably has more experience with Ruby | than you do, and probably less with Python, I'd | characterize the relationship as inverted -- Ruby is more | consistent than Python. | | In Ruby, parens are optional for all methods, and only | required if you need to force non-default precedence. | | Returning the value of the last expression seems | reasonable to me (just like a UNIX shell). | | In Python, I'm bothered by the little inconsistencies. | Why is str.len (or length, or size, or count, etc) not a | method? Why len(str) instead? | | And Python has plenty of oddball syntax: significant | whitespace, triple quotes?? You get used to it of course. | | Ruby and Python are about equally efficient -- if you're | optimizing for code efficiency, both are bad choices. In | many domains, that's not a critical metric, so we talk | about developer efficiency. I'll argue that developers | are more efficient when they are more happy, and for me | that selects Ruby by a mile over Python. | | But I won't pretend that it's more than a matter of | taste. :) | wood-porch wrote: | I feel very similarly about Python vs. Ruby | inconsistencies! I remember starting a job and used | python for the first time coming from Ruby, and being | extremely disappointed in the inconsistencies in the | standard library and the sheer... lack of features in the | Stdlib compared to Ruby. I've yet to use a language with | such a magnificent stdlib and documentation. I main | python nowadays, and I find the ecosystem and typing to | be better than Ruby, but Ruby is the best language I've | ever used for many reasons | cb321 wrote: | Nim has impressive compile-time reflection which with its | syntax macro system can (some of the time) get you similar | powers to Python's dynamic reflection. E.g., | https://github.com/c-blake/cligen instead of `autocommand` | or `click` or `argh` or you name the automatic CLI | generator, only with full C-like speed for your programs | and a very low effort FFI to C. People have done web | frameworks, too, but I do not know them well enough to | compare to Django. Perhaps someone else could follow-up. | | Compile times are not the 25-50 ms of a Python interpreter | startup, but they are similar to the 250-500 ms of a Go or | D compile, at least for small light on metaprogramming | loops kinds of programs, and with, say, the TinyC tcc | backend. | | Of course, big frameworks take a long time to import (or to | compile). So, your comparison mileage may vary. And once | "ready to go" and finished a Nim program can start up in | sub-millisecond time like any C program (esp. if statically | linked). | mrkeen wrote: | There are plenty of statically-typed languages which are a | bit further along than 'a good start'. | [deleted] | [deleted] | pdonis wrote: | You might take a look at Nim. | [deleted] | rr808 wrote: | I really struggle with this because I'm a C++/Java dev who is | 4/10 with Python. I dont understand why anyone would choose a | single threaded language but its just everywhere I can't avoid | it. | baq wrote: | If your problems need threads and raw CPU, you're doing well, | since that obviously isn't Python's niche. The thing is, most | problems aren't like that and if some parts are, Python | probably has a C extension for it, so it doesn't matter nearly | as much as you think. | piyh wrote: | Do you write a lot of multithreaded code that can't use a | shared nothing model? | vb-8448 wrote: | CPU-bound tasks are limited to a single core due to GIL but, | for sure, it's not single threaded language! | synergy20 wrote: | so is javascript, single threaded language. somehow these two | are super popular. | | both can do async, both have libs for multithread workloads. | | I wonder how critical the language itself is as far as multi- | threaded goes. | kmac_ wrote: | I'm C#/Java dev who works with Python and ML devs. I'm amazed | how fast they can put things together and solve problems. We've | embedded Jupyter to our product recently, and what I can tell, | that's the way. Even the integration team started to use it to | glue things together. I'm becoming a huge fan, it does the job. | stevesimmons wrote: | Python's been my main language for 22 years now. | | Whenever I think I should switch to faster, more efficient | language (C#/Go/Rust/...), I am repeatedly blown away by what | Python lets me do, with an incredibly ecosystem of packages, and | all the ergonomics of incremental development from a REPL. | | Case in point is my current project: building a parser for PDF | bank statements from all UK banks. I can match a 10page bank | statement against a library of 100 templates, and then extract | its data in a standardised format, in around 50ms per statement. | | That's broadly comparable to the time for load the source file | from cloud storage. | | And that 50ms is processing pages sequentially, using a single | core on my little laptop. Plenty of scope to parallelise if I | wanted to. | | The reason why I'm still using Python, to borrow a slogan from | Bruce Eckel long ago, "Python fits [my] brain". | roflyear wrote: | How are you matching a file to a template like that? | shanebellone wrote: | I have Python analytics capturing HTTP Headers, processing | them, and finally storing them in less than 8ms on a single | core dev instance. Python is plenty fast for many things. | | Also, I love the syntax. It reads like a sentence. | Someone wrote: | > in less than 8ms on a single core dev instance. Python is | plenty fast for many things. | | What's that, nowadays? 25 million cycles, 75 million | instructions? | | Python isn't plenty fast, modern hardware is. | KyeRussell wrote: | The person you're replying to is saying that Python meets | their needs. Judging by what they've said about their use | case, I doubt it's a meaningful affirm to their overall | pipeline. | | Your counterpoint is that it'd be slower if it were running | on a Pentium 4. Do you honestly think that they don't know | this? | | Yes, this is precisely the point. Things are at a point | where Python's benefits are worth more than what another | language would bring in speed improvements. I imagine that | there would be less of a benefit to busses if we had to | Flintstone them everywhere instead using a combustion | engine. That's not the current reality though. | pdonis wrote: | More precisely, modern CPUs are so much faster than network | or file I/O that if your program has to wait on I/O, the | CPU is going to sit idle most of the time anyway, so trying | to optimize CPU time is pointless. The GP's use case is an | example: he's capturing HTTP headers, so the bottleneck is | network I/O, not CPU. So Python for his use case is, as he | says, plenty fast. | | For use cases where CPU is the bottleneck, such as numeric | simulations, Python users reach for something like numpy, | where all the CPU intensive stuff is being done in C | extensions, not Python bytecode. | elabajaba wrote: | My problem with Python, especially when reading someone else's | code, or my own old bad code, is that I find that Python | doesn't fit [my] brain. | | The lack of typing (in my experience you always end up with a | bunch of libraries that don't have type hints) means I spend | most of my time just figuring out what I'm supposed to pass to | a function (I hate the django docs. Give me something like | docs.rs where I can quickly scan what functions something | implements, and see what they accept and what they return | instead of forcing me to read an 800 page novel that STILL | doesn't give you that basic info), and writing tests and trying | to guard against passing the wrong thing around. | dehrmann wrote: | > The lack of typing | | It's gotten a lot better with type hints and typeshed, but I | agree, not knowing what type an arg should be and hoping duck | typing works out isn't great. | stevesimmons wrote: | In my own code, I always use typehints and write good | docstrings (nearly) everywhere. | | Visual Studio Code's type checker saves so much time and has | improved my code quality to no end. It is especially powerful | on polymorphic inputs, making sure the different code paths | operate on the input type you expect. | shanebellone wrote: | PyCharm is good for this too. | | I've recently started using Type Hints by default. At the | very least, it makes your code more readable. Nothing bad | comes from that. | mharig wrote: | I do not see the benefit of type hints. Good docstrings | (and naming of the function and arguments) are superior, at | least for the human. Type hints are too much clutter. | baq wrote: | There's a certain program size from which they start to | make sense and further still the benefits are obvious - | you have a computer to help solve puzzles for you, so why | not use it if the puzzle is 'will this peg fit into that | hole?' when you have thousands of pegs and holes. | Ultimatt wrote: | 50ms doesn't sound especially fast. If you had a million of | them to process thats 4 hours, maybe an hour with some | parallelism? A 100x speedup from going native then becomes | quite welcome. Python has its place, but the fact you even | think the tens of ms domain is "fast" or even fast enough on | modern CPUs shows the real strength of Python, which is most | people dont actually care at all about performance. Thats not | to say its performant though. Just that no one cares anymore. | Some rando boss is happy to wait 4 hours for your script to | chug through a million statements, because no one actually told | them it can take 2.5 minutes in a native language. If they did | maybe the boss would suddenly speak about their dream to not | only process the data but have a near real-time BI panel | instead of a batch report so they can react within one business | day. The issue with Python is missed value, not the value it | can deliver. | squeaky-clean wrote: | Why limit parallelism to 4x? Spin up a ton of lambdas and get | it done in 10 seconds. | | You're also forgetting that 50ms time to load each file from | cloud storage. It's still 4 hours and 2.5 minutes with your | native code compared to 8 hours with Python. Suddenly not | such a massive improvement. | | Even then I don't see the issue with it taking 4 hours to do | a million of them. Do you need to do a million per hour? Is | it even likely they'll need to do a million of them total? | | Do bank statements even come in frequently enough to do a | realtime dashboard with? I get my bank statement every 30 | days. | | How much longer does it take to develop the native version? | How much longer does it take to modify when a bug is found or | a bank changes their statement layout? How much more do you | have to pay a native code engineer compared to a Python dev | and how easy are they going to be to replace eventually? | blindhippo wrote: | One dimension to consider here is cost of compute. | | Going from 8 hours to 4 hours is a 50% reduction in the | time to compute and we're assuming this is occurring on the | same relative hardware/instance size. | | At scale, that could translate into hundreds of thousands | of dollars in savings. | | But your points are relevant - as with anything related to | development, "it depends" rules the day. There isn't a | clear cut "x is objectively better than y" in general. | stevesimmons wrote: | > The issue with Python is missed value, not the value it can | deliver. | | I'm very aware of the business value here! The limiting | factor in these types of "messy real-world data" problems is | the developer time to get 100+ templates right on all the | different variations encountered in the wild. I can iterate | on each template extremely effectively in a Jupyter notebook | REPL, and immediately rerun a sample of 100 statements for | that bank in a few seconds. | | While the total corpus of statements I have access to is | actually around a million, no one cares how quick processing | them all are if the extraction isn't reliable enough! | aidos wrote: | Exactly. The time spent developing a solution for your | problem in pretty much any other language is going to cost | magnitudes more than processing millions of documents in | python. And that's ignoring the ongoing maintenance where | the hackability of teasing data out of PDFs in ipython is | going to top any other system. | | I have a soft spot for the work you're doing since I've | spent a good portion of my life now extracting data from | PDFs and can appreciate the joys of the process more than | most. | justinsaccount wrote: | > If you had a million of them to process thats 4 hours | | If you had 20 bank accounts sending you monthly statements | for 100 years you'd have 24,000 of them. 50ms each would take | you 20 minutes to process the 100 year backlog. | | If you have a million of them to process then you're a bank | or similar type of institution that can devote resources to | this, either computational or developer time to optimize | things. A 128 core c6a.32xlarge would turn the runtime from 4 | hours into 1.9 minutes and cost $5 to run for an hour. | [deleted] | lowbloodsugar wrote: | Plenty of languages have a huge package ecosystem. Your problem | is that you don't know them. I'm not saying the distinction is | helpful for your situation, but your problem is "I have too | much time invested in learning Pythons ecosystem" and not | "other languages don't have all the packages I need." For REPL | that's another mindset. You use a REPL to experiment and | prototype, I use unit tests. You use python because you already | learned it. Your brain has been fit to python, not the other | way around. You can fit it to other languages if you choose. I | am currently learning my 7th "use in production" language. | stevesimmons wrote: | You're partly right. However Python's sweet spot for me is | when writing code to process complex, messy, poorly | understood data. Using a Jupyter notebook lets me keep | partially processed inputs as live objects, examine and | change their in-memory representations, and quickly prototype | the next stage of processing. It feels like sculpting with | playdoh. | | Once that's working, the code moves from the Jupyter notebook | into a proper code module with unit tests. Then the emphasis | is on building the production system rather than manipulating | the data. | | I get what you mean with unit tests. Just for me it feels | further away from the data, which is where most the | complexity in my business domain lies. | lowbloodsugar wrote: | Sure. I do use Jupyter in a decent IDE for some adhoc data | diving or for a spike prototype before "downcoding" into a | cluster. | [deleted] | MrVandemar wrote: | >Case in point is my current project: building a parser for PDF | bank statements from all UK banks. I can match a 10page bank | statement against a library of 100 templates, and then extract | its data in a standardised format, in around 50ms per | statement. | | I'm interested in management of domestic documents and similar | institutional correspondence, and I'd love to hear more about | how you approached and solved your problems with the PDF bank | statements. | | I have lots of bank statements ... and other documents like | utility bills, rates invoices, etc ... and I'd love to just be | able to feed them to a script and automatically tease out | salient details. | welder wrote: | We ported a client-deployed command line program from Python to | Go two years ago and couldn't be happier. It's solved all our | problems around shipping code to customers in different | environments. It greatly reduced our support workload. | | However, we still use Python for APIs and Web Apps. No language | is better than another, some are just better for one solution | more than another. | bjourne wrote: | It's the ecosystem. All languages have libraries for bottom-up | parsing. But few are as well-documented, feature-full, and easy | to use as SLY: https://sly.readthedocs.io/en/latest/ Many | languages have libraries for ANSI color support and pretty | printing, but no other language has Rich: | https://rich.readthedocs.io/en/stable/index.html While other | languages may have rudimentary datetime support, Python has | (multiple!) libraries for converting between Hebrew, Hijri, | Coptic, and Armenian dates. | revskill wrote: | I found joy in programming not by importing some libraries and | use it. | | It's the manipulation of data that makes me enjoy programming. | | Python ? Not fun at all. Try list comprehension. You read it from | right to left ? | | Or process data, not by left to right (pipeline), but in a messy | order. | | One liner lambda ? | | Indenttion, self, pip hell. | | Too many small quirks which force me not to use Python for "fun". | | For serious stuffs ? Maybe python is the best choice now. ___________________________________________________________________ (page generated 2022-12-30 23:00 UTC)