Сравнение производительности различных компиляторов и интерпретаторов Python

Сравнивать будем два компилятора и два интерпретатора языка Python: Cython, Nuitka, PyPy, CPython. Сравнивать будем с Си. Проверять будем на примере алгоритма подсчета чисел Фибоначчи.

Язык Си

#include <stdio.h>
 
 
int fib(int n) {
    if(n < 3) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }
}
 
int main(void) {
    printf("%d\n", fib(30));
}

gcc fib.c -o fib
time ./fib
832040
./a.out  0,01s user 0,00s system 2% cpu 0,372 total

CPython (Python 2.7)

def fib(n):
    if n < 3:
        return 1
    return fib(n-1) + fib(n-2)
 
 
if __name__ == '__main__':
    print fib(30)

time python fib.py
832040
python fib.py  0,34s user 0,05s system 37% cpu 1,031 total

Cython без ctypes (тот же код)

Makefile можно взять отсюда

time ./fib
832040
./fib  0,24s user 0,01s system 80% cpu 0,309 total

Cython with ctypes

cdef fib(int n):
    if n < 3:
        return 1
    return fib(n-1) + fib(n-2)
 
 
if __name__ == '__main__':
    print fib(30)

time ./fib
832040
./fib  0,05s user 0,01s system 45% cpu 0,143 total

Nuitka

def fib(n):
    if n < 3:
        return 1
    return fib(n-1) + fib(n-2)
 
 
if __name__ == '__main__':
    print fib(30)

nuitka --exe fib.py
time ./fib.exe
832040
./fib.exe  0,34s user 0,05s system 31% cpu 1,229 total

PyPy

time pypy fib.pyx
832040
pypy fib.pyx  0,23s user 0,02s system 60% cpu 0,423 total

Итог

Самым быстрым оказался Cython с типами Си, чуть медленнее - без использования типов Си. Выигрыша производительности у Nuitka почти нет, а вот PyPy показал неплохой результат для интерпретатора.

Интерпретатор/Компилятор Время исполнения в секундах
Си 0.01
Cython 0.05
PyPy 0.23
Cython without ctypes 0.24
Nuitka 0.34
CPython 0.34