Does the Python 3 interpreter have a JIT feature?

Question:

I found that when I ask something more to Python, python doesn’t use my machine resource at 100% and it’s not really fast, it’s fast if compared to many other interpreted languages, but when compared to compiled languages i think that the difference is really remarkable.

Is it possible to speedup things with a Just In Time (JIT) compiler in Python 3?

Usually a JIT compiler is the only thing that can improve performances in interpreted languages, so i’m referring to this one, if other solutions are available i would love to accept new answers.

Asked By: guz

||

Answers:

You can try the pypy py3 branch, which is more or less python compatible, but the official CPython implementation has no JIT.

Answered By: unddoch

The only Python implementation that has a JIT is PyPy. Byt – PyPy is both a Python 2 implementation and a Python 3 implementation.

Answered By: Ngure Nyaga

This will best be answered by some of the remarkable Python developer folks on this site.

Still I want to comment: When discussing speed of interpreted languages, I just love to point to a project hosted at this location: Computer Language Benchmarks Game

It’s a site dedicated to running benchmarks. There are specified tasks to do. Anybody can submit a solution in his/her preferred language and then the tests compare the runtime of each solution. Solutions can be peer reviewed, are often further improved by others, and results are checked against the spec. In the long run this is the most fair benchmarking system to compare different languages.

As you can see from indicative summaries like this one, compiled languages are quite fast compared to interpreted languages. However, the difference is probably not so much in the exact type of compilation, it’s the fact that Python (and the others in the graph slower than python) are fully dynamic. Objects can be modified on the fly. Types can be modified on the fly. So some type checking has to be deferred to runtime, instead of compile time.

So while you can argue about compiler benefits, you have to take into account that there are different features in different languages. And those features may come at an intrinsic price.

Finally, when talking about speed: Most often it’s not the language and the perceived slowness of a language that’s causing the issue, it’s a bad algorithm. I never had to switch languages because one was too slow: When there’s a speed issue in my code, I fix the algorithm. However, if there are time-consuming, computational intensive loops in your code it is usually worth the while to recompile those. A prominent example are libraries coded in C used by scripting languages (Perl XS libs, or e.g. numpy/scipy for Python, lapack/blas are examples of libs available with bindings for many scripting languages)

Answered By: cfi

If you mean JIT as in Just in time compiler to a Bytecode representation then it has such a feature(since 2.2). If you mean JIT to machine code, then no. Yet the compilation to byte code provides a lot of performance improvement. If you want it to compile to machine code, then Pypy is the implementation you’re looking for.

Note: pypy doesn’t work with Python 3.x

Answered By: Aniket Inge

First off, Python 3(.x) is a language, for which there can be any number of implementations. Okay, to this day no implementation except CPython actually implements those versions of the language. But that will change (PyPy is catching up).

To answer the question you meant to ask: CPython, 3.x or otherwise, does not, never did, and likely never will, contain a JIT compiler. Some other Python implementations (PyPy natively, Jython and IronPython by re-using JIT compilers for the virtual machines they build on) do have a JIT compiler. And there is no reason their JIT compilers would stop working when they add Python 3 support.

But while I’m here, also let me address a misconception:

Usually a JIT compiler is the only thing that can improve performances in interpreted languages

This is not correct. A JIT compiler, in its most basic form, merely removes interpreter overhead, which accounts for some of the slow down you see, but not for the majority. A good JIT compiler also performs a host of optimizations which remove the overhead needed to implement numerous Python features in general (by detecting special cases which permit a more efficient implementation), prominent examples being dynamic typing, polymorphism, and various introspective features.

Just implementing a compiler does not help with that. You need very clever optimizations, most of which are only valid in very specific circumstances and for a limited time window. JIT compilers have it easy here, because they can generate specialized code at run time (it’s their whole point), can analyze the program easier (and more accurately) by observing it as it runs, and can undo optimizations when they become invalid. They can also interact with interpreters, unlike ahead of time compilers, and often do it because it’s a sensible design decision. I guess this is why they are linked to interpreters in people’s minds, although they can and do exist independently.

There are also other approaches to make Python implementation faster, apart from optimizing the interpreter’s code itself – for example, the HotPy (2) project. But those are currently in research or experimentation stage, and are yet to show their effectiveness (and maturity) w.r.t. real code.

And of course, a specific program’s performance depends on the program itself much more than the language implementation. The language implementation only sets an upper bound for how fast you can make a sequence of operations. Generally, you can improve the program’s performance much better simply by avoiding unnecessary work, i.e. by optimizing the program. This is true regardless of whether you run the program through an interpreter, a JIT compiler, or an ahead-of-time compiler. If you want something to be fast, don’t go out of your way to get at a faster language implementation. There are applications which are infeasible with the overhead of interpretation and dynamicness, but they aren’t as common as you’d think (and often, solved by calling into machine code-compiled code selectively).

Answered By: user395760

The Numba project should work on Python 3. Although it is not exactly what you asked, you may want to give it a try:
https://github.com/numba/numba/blob/master/docs/source/doc/userguide.rst.

It does not support all Python syntax at this time.

Answered By: rubik

If you are looking for speed improvements in a block of code, then you may want to have a look to rpythonic, that compiles down to C using pypy. It uses a decorator that converts it in a JIT for Python.

Answered By: jdavid_1385
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.