I just wanted to give my 2 cents without answering to anyone in particular. I happen to know Python very well, though sometimes I feel like I only scratched the surface, while with Clojure - though I learned it more recently - I know it: once you understand the basics of it you’re done.
Yes, you’re left with transducers and core.async, but the formers are already being ported to other languages and the latter, well Go is basically just it. So, after you understand these concepts as well my claim is that your Clojure code can actually go faster than regular Java (and especially Python) code. Why do I say this? Because with Clojure I don’t need loops, I just build transducers and then stuff them into a pipeline-something and that’s it. Boom. Parallel/Async processing.
Now try doing that with Python. Good luck. Asyncio is the craziest thing ever come out and makes everything so complex you want to simply pull your eyes out of your head and multithreading is very poorly supported. I have to add that I’m a data scientist/engineer, so usually my code is performance sensitive and with Clojure I was able to find the right tradeoff between performance, ease of development and maintenance cost.
Now about simplicity. Take at look at this: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/svm/base.py. If you can understand this code ins and outs in less than 30 minutes either you wrote it in the first place or you’re a freaking genius. Python isn’t simpler than Clojure, it’s just that we’re used to stare at very simple scripts, but as soon as you have to get down to the serious stuff, well, so much for ease of use.
What the heck is ABCMeta
? What about @property
? Does it read as english? ‘At property’??? Is it a comment?
Well, ABCMeta
is a class that you have to import from a separated module and use it to create abstract classes. @property
: first off, it is a decorator. Guido didn’t like f(g(z(x))) notation, so now we have decorators. It is just a wrapper function called in a different way. Yes, it is a wrapper function that you use in methods inside classes definition to deal with properties and that returns new objects. That’s easy!
The point is that as soon as SLOC increase every language gets more and more complicated, by how much is the real matter. As an example, if you’d like to contribute to a library as complex as scikit-learn you need years under your belt of Python development, and for many it would be too overwhelming to do anyways. In Clojure, after a few months of development you can contribute to Incanter without many problems, though it is a much larger library in scope than scikit-learn (take the libraries as examples only for code complexity, to really contribute to these one needs expertise in data science and machine learning as well).
So Python is much easier to learn and to use for very simple stuff, it is almost unbeatable. For more serious stuff, good luck.