Get Intel® Distribution for Python* for free today!
Python is a very powerful programming language because of its simplicity and the availability of libraries that help programmers do really amazing things — from building websites to building deep neural networks (DNN). Yet, despite Python’s versatility, its performance is often not on par with that of compiled languages like C and C++. This has been a thorn in Python’s flesh for a while. Fortunately, however, there are ways to effectively overcome this challenge.
This post discusses strategies for improving the performance of Python applications by making them run faster and use fewer resources.
Before diving into these Python optimization strategies, a word about feasibility: Some of these optimizations can be applied to your entire code base with very few changes, but others require rewriting entire applications if used on the whole codebase. A rule of thumb for using these methods is to apply them to the parts of the code that are computationally intensive. This would give you the needed speed-up with minimal cost with regard to development time.
Use C/C++ functions
One of the most effective ways of speeding up Python is to implement slow parts of your code in C/C++ and to call them from Python. As you may imagine, you may want to use this method selectively depending on how much experience you have with these languages. However, if used effectively, you can get some of the benefits of having your code running close to the metal while enjoying the flexibility of Python.
Tools like SWIG and Pyrex make it easy to wrap C/C++ code in Python. Python also provides ctypes (from Python 2.5) which can be used for the same purpose. Each of these methods performs the task differently, and each has advantages. It is therefore advisable to do some research before choosing any of them.
Use a JIT interpreter
Just in Time (JIT) interpreters like PyPy are capable of speeding up Python code. This is because JIT interpreters, as the name suggests, compile and recompile code just in time during code execution. This style of compiling code is focused on optimizing the performance of code by analyzing the running code and dynamically finding the best means of compiling to increase performance. Apart from speed, PyPy reduces memory usage, and provides default support for stackless mode.
Unlike the previous solution, there is no need to rewrite any code. All you need to do is run your code with PyPy instead of Python. It should be noted that PyPy may not work properly with code that uses C/C++ extensions. This is an important thing to consider, especially if you plan on using the previous method on your code. In this case, you might consider using Numba, a compiler that builds optimized code that can be executed on CPUs or GPUs. Numba can be bridged with PyPy to support code that does not work with C or C++ extensions.
Use Fast Libraries and Idioms
Python provides some methods to speed up your code that are available by default, such as generators and list comprehension. Generators help to speed up code by reducing RAM usage, thereby making it more efficient to loop through large collections. List comprehension also provides speed-ups by eliminating the need to suspend a function’s frame, unlike what happens in loops. This makes list comprehension less computationally intensive than is typical for loops.
Python also provides built-in libraries like itertools that create efficient iterators for efficient looping. This library also provides efficient functions for some computationally intensive tasks like permutations and combinations.
There are also some third-party libraries like NumPy and Numba that have a lot of their functions implemented in C, which makes them more efficient than equivalent Python implementations. These libraries are also optimized for computationally intensive applications like mathematics and machine learning, making them excellent for leveraging Python’s simplicity without losing performance.
Reduce Code Complexity and Computational Complexity
One way of speeding up Python code which is applicable to programming in general is to keep your code simple and to reduce the computational complexity of your code. This means of speeding up code may require some amount of mental effort, unlike the previous solutions. On the idea of keeping your code simple, it is important to be aware of the implementation of some of Python’s built-in functions. Even though they can make your code simpler, they may increase the computational complexity of your code depending on how you use them. There are some situations where Python’s simplicity will work against you, and you’ll have to do things the hard way.
For improving your code, consider using Intel Vtune Amplifier and Intel Advisor, which profile Python code and find performance bottlenecks.
Use Intel’s Python Distribution
Finally, a very simple way of speeding up your Python code is to use the Intel® distribution for Python https://software.intel.com/en-us/distribution-for-python Note that this will only be useful if you have Intel processors because this distribution is optimized for Intel processors. This Python distribution is based on Anaconda and implements libraries like NumPy with Intel’s math libraries without changing the interface provided by the libraries. This Python distribution is also optimized for DNNs and other forms of machine learning.
You can download this Python Distribution from Intel’s official website for FREE and install it using the instructions provided. Just like PyPy, there’s no need to make any changes to any existing Python code. All you need to do is install the new distribution and run your code. This means no new learning curve has to be overcome.
There are a number of strategies and tools available for helping to make Python code more efficient. No matter how good your Python code is when you first write it, there are likely ways to make it even better, and taking advantage of these optimization opportunities is crucial for building high-performance, cost-efficient applications.