Been doing a lot of coding in python lately. While some of the hackability of the language is nice for doing some cool things, overall, I cant say im a fan. Its a little too obscured for writing algorithms where effiency is important. Its hard to tell what data types are truly backing various variables and thus makes it tricky to pick the right implementation. I think im working with raw arrays and they turn out to be linked lists or worse. Even then things like a "Dict" isnt always clear if its a Tree implementation or a hashmap implementation or something else entirely.
Granted this isnt an impossible task, I have managed to figure it out by pulling open the source code of the libraries I call and using profiling tools. But python seems to not care or obscures a lot of that.
@freemo I think that python is optimised for reducing *development* time. It's good for when you need to do something quick-and-dirty, the sort of thing where you need to only ever run it once or twice and you're really not going to be stretching the processing or memory bounds of the computer. The sort of thing where it's important that the code be readable, because there's a good chance that if you ever want to run it again, you'll need to tweak it a bit, first.
And in that narrow domain, it's really very good. But outside of that domain, it's probably not the best choice...
@freemo Python is used in a lot of places that it is not really all that well suited for. This seems to be largely because someone discovers how great it is with short, quickly coded, demonstration problems - which is where it is at its best - and then starts trying to use it for everything.
Now, it can *do* just about everything; and having a shorter development time is a solid advantage in a large slice of 'everything'. It's just that, once you get away from simple demonstration problems and into large, serious projects, then there are usually other languages that work out better; but even there, there's a very large category of problems where the difference might be fairly marginal.
So it gets used in a lot of places where it's not the best choice - because in some of those places, it's still a *decent* choice, just not the *best* choice.
@freemo Oh, yeah; and that popularity comes, I suspect, from the fact that it is *super* good at the sort of quick demonstration problems that one can use to show off the capabilities of a language.
But I think that the recent sunsetting of Python 2 is also important to bear in mind when developing for the language. Some languages have long-term stability - the sort of language that you can write software in and then expect that software to continue to work over multiple decades (after which a developer the age of your grandchildren, chuckling at the quaintness of your code, will probably go to a lot of trouble to rewrite it such that it takes proper advantage of quantum computing or similar). Python is not one of those languages. Python is a language for the short term; a language of quick results and instant gratification, to be used in situations where it can be maintained on-the-fly by in-house (or on-contract) programming staff.
Which is an important niche. But not, by a very long shot, the *only* niche.
@ccc yea being good for "I slapped this together real fast" means it gets more exposure even if someone may not use it as their primary language, it willb e disproportionately represented.
I have no shortage of complaints about python, in fact I dont code in it too often, just when getting contributors is a top prioority or when its geared towards developers and a lot of adoption means more $$$. In general its actually one of the last languages I will use. So I dont need many reasons to dislike it, the whole python2 nonsense is a **huge** one, I also dont like that it is strict on whitespaces, the lack of true privacy/protected elements, and the other points we discussed.
If i dont get about the size of the user base but I need something that has the advantages of python with fewer of the annoyances I go with Ruby actually. Even then Ruby isnt my top choice of a language for enjoyment or for serious projects.
@freemo Though there are a lot of issues with python in many situations, I find I actually like its strictness on whitespace. It means that when I glance at the code, it's super easy to tell how far loops go, and where loops end. In C++ (which is what I use when I want to do something serious) it's quite trivial to create code such that what *looks* like a loop is actually *outside* the loop, which has potential implications for maintainability. (Now, I can get exactly the same effect by telling emacs to auto-indent the entire C program; so python's whitespace strictness only really saves a couple of keystrokes. It's still nice, though.)
I mean every Turing-complete language can “do just about everything”…
I got turned off from python a while ago. It was the lack of static typing, the overcomplicated bizarrely behaved parallel processing, and the fact that if my text editor is incapable of understanding a program’s structure, then how the hell am I supposed to understand it?
Oh and the fact that it’s slow.
Every time I wrote a python extension to go with my old awful python code, and it segfaults from a double free again with no way to tell how or why it happened, I just started asking myself, “Why don’t I just write EVERYTHING in C?” At least C has a debugger that isn’t pants-on-head retarded.
@freemo @ccc C is a little verbose, but if you just go with certain standard extensions (POSIX, basically), you can do a lot of “high level” stuff with it pretty cleanly. It’s when you try to be “cross platform” that C starts getting pretty nightmareish, mostly thanks to Microsoft and Apple.
Or rather, I can do a lot of high-level stuff. It’s a good language if you are the sort of person who forgets what module you imported the “foo” function from like 2 minutes ago. It’s not a good language if you don’t want to sit there typing “very_important_module_foo()” every time. You definitely shouldn’t use it if a different language works better for you.
I am using high-level here to include certain ideas such as:
* platform independence
* minimal resource management (memory management)
* implied performance improvements (memory slating, cacheing of certain operations that are repeated, etc)
* automatic handling of by-reference and by-value in a safe way obscured from the coder
and many more other things. while you can wrangle C into doing any of those things, as well as many of the things I didnt mention, it is not intrinsic to the language.
Agreed. The thing about prototying is, while python is fine at doing that, it also means if it isnt suited to the full system you are prototying to demonstrate (as in it isnt suited to a more complex application) then your prototype is essentially a throw-away prototype.
In that sense I'd argue it isnt really well suited to prototying at all as one would hope that when you go past the prototype stage you would not need to start completely from scratch. So as a prototype it has less value than a prototype written in another language.
Well I've coded in python before, and I'm doing it again. So clearly I do think it is workable and has a place. Though after this project I might use it a little less.
My projects can be big, but not interdependent. Like a huge API layer is fine since each component tends to be pass through and very isolated.
@freemo @cy I'll admit, I probably use C++ in rather more places than it is strictly best in - simply because I tend to default to it. C++ isn't always the best language, mainly because it takes more development time than certain other languages (like, say, Python) - and more developer *care*, as well. This is because it gives you a lot of control over things that are abstracted away by high-level scripting languages; which is both a strength and a weakness (strength: you can handle the situation correctly even in odd circumstances weaknes: you *need* to handle the situation correctly in *all* circumstances).
So it takes a bit longer to write; but if you do it correctly, and do some very thorough testing-and-debugging, you end up with very solid, reliable code.
I am proficient enough with almost any language (aside from a few obscure ones) that the language itself, in terms of syntax, isnt a huge limiting factor for me.Most of the time I never even get far enough into my considerations to think of the language quality itself. The very fact that C++/C is compiled will often cause me to reject or select it as an option there alone. For example I love haskell conceptionally but almost never use it because it is compiled (there is an interpreted version but that has its own limitations as it is less popular).
Compiled to system-level binaries (and therefore platform dependent even if the code itself isnt platform dependent) will often rule out half the languages i want to use right off the bat. If I'm using a scripted language the fact that the code can be run directly and in its current form can be run on any system is often the very first requirement.
@ccc I generally opt to use python for the same reason i think many others do, and ultimately why it gets overused.... its popular.
I have a motivation to use the most popular language (of which python is it) because that means a larger audience and more chance of both consumers, clients, and contributors.
The worst part about it is the more it is used where it isnt suited the more pressure there is to use it even when it isnt suited.