There are three observations which are really interesting to me.<p>One is that traditionally, there was a clear split between "system languages" which were usually fast, compiled languages that were relatively verbose, not very comfortable, and comparatively unsafe -- and "scripting languages", which were dynamically typed, dynamic memory management, often interpreted, offered more data types and facilities, but were slower.<p>C belonged clearly to the first group and shell scripts, Perl and Python to the second.<p>But the gap between these two groups has been shrinking, as languages are overall converging: Java uses dynamic memory management, Go has a very fast compiler, C++, Scala and Rust have iterators, type inference and such. On the other hand, script-like languages added type annotations, got generally faster, and so on. Much of this is due to better and better compilers.<p>Python stands out in this landscape like a sore thumb - its performance did not profit much from better compilers.<p>There is another axis which is the range between direct low-level manipulation of bits and bytes and symbolic computation and functional languages. Lisps, OCaml, Scala and Haskell are from the family tree of symbolic computation. Traditionally, these languages were heavy-weights and slow compared to the system languages, but they also have seen enormous progress from better compilers - Common Lisp implementations like SBCL can now produce code which is almost as fast as C. As a consequence, there is also a convergence of general languages with "symbolic" features like first-class functions, type inference, list comprehensions, and so on.<p>The third observation which I find very interesting is how much Python and modern Lisps/Schemes do have in common. If one has a close look, the extend of this convergence is really astonishing.<p>Here are some things that modern Lisps like SBCL, Schemes and functional languages on the one hand side, and Python3 do have in common:<p>* a Read-Eval-Print Loop (REPL)<p>* strong dynamic typing<p>* automatic memory management<p>* memory safety<p>* exceptions<p>* a wide choice of built-in data types: lists, strings, vectors, arrays, dictionaries / hash maps, tuples, sets<p>* keyword arguments and optional arguments in functions<p>* handling of names in scopes and names spaces<p>* closures and lambda functions<p>* list comprehensions<p>* pattern matching (limited support for tuples and lists in Python)<p>* Unicode strings<p>* arbitrarily long integers<p>* complex numbers<p>* rational numbers<p>* number type are part of a hierarchical type hierarchy (numeric tower)<p>* empty sequences, containers and strings are logically false<p>* support for threads (but no real parallelism in Python)<p>* low-level bit operations (a bit limited in Python)<p>* easy way to call into C code<p>* type annotations<p>* if ... else can be used as an expression<p>* string formatting is a mini language<p>* hexadecimal, octal and binary literals<p>* standard functions for functional programming like map and filter<p>* support for OOP (e.g. by the Common Lisp Object System)<p>* support for asynchronous execution<p>The few remaining distinctions between Lisps and Python are:<p>1. Lisps use parentheses to determine scope, while Python uses indentation and white space.<p>2. Lisps usually compile either to native code or to JIT-compiled byte code, while standard Python uses interpreted byte code.<p>3. Python does not support true parallel execution within the same process.<p>4. Lisps have of course the typical macro system which, for example, allows to define new control constructs, while Python does not have macros.<p>5. Lisps and Schemes have with conditions, restarts, and continuations some unique way to handle errors and manipulate the control flow (see <a href="http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html" rel="nofollow">http://www.gigamonkeys.com/book/beyond-exception-handling-co...</a> )<p>So, what I find really interesting is that for example Common Lisp, which was standardized first in 1984, has so many features in common with more recent languages - and still much better performance than python:<p><a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/python3-java.html" rel="nofollow">https://benchmarksgame-team.pages.debian.net/benchmarksgame/...</a><p><a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/lisp.html" rel="nofollow">https://benchmarksgame-team.pages.debian.net/benchmarksgame/...</a><p><a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/racket-java.html" rel="nofollow">https://benchmarksgame-team.pages.debian.net/benchmarksgame/...</a><p><a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/ocaml-java.html" rel="nofollow">https://benchmarksgame-team.pages.debian.net/benchmarksgame/...</a>