С PyPy действительно на одном уровне с C:
time pypy ./test.py
0.782010319461real 0m3.475s
user 0m3.464s
sys 0m0.011s
но вот только объяснение этому такое:
https://ru.wikipedia.org/wiki/PyPy
>PyPy состоит из стандартного интерпретатора и транслятора. Интерпретатор полностью реализует язык Python. Сам интерпретатор написан на ограниченном подмножестве этого же языка, называемом RPython (Restricted Python). В отличие от стандартного Python, RPython является статически типизированным для более эффективной компиляции
>C — трансляция кода RPython в C и запуск как родной программы; это стандартный режим работы;
Кроме того если в приведённый выше код на C добавить одну строку из openmp:
#include <stdio.h>
#include <math.h>void main()
{
int i;
double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for( i = 0; i < 100000000; ++i )
sum += sin(i);
printf("%.12f\n", sum);
}
То результаты C кардинально меняются:
gcc test.c -fopenmp -lm
time ./a.out
0.782010319461
real 0m0.545s
user 0m4.207s
sys 0m0.000s
Добавим нолик к диапазону:
Python2: отказывается исполнять такой код
time python test.py
Traceback (most recent call last):
File "test.py", line 9, in <module>
print(test())
File "test.py", line 5, in test
for i in range(1000000000):
MemoryError
Python3:
$ time python3 test.py
-0.12454896270324128
real 2m37.319s
user 2m37.137s
sys 0m0.015s
PyPy:
time pypy test.py
-0.124548962703
real 0m40.081s
user 0m40.035s
sys 0m0.008s
код на C без openmp:
time ./a.out
-0.124548962703
real 0m38.697s
user 0m38.659s
sys 0m0.000s
код на C c openmp:
gcc test.c -fopenmp -lm
time ./a.out
-0.124548962703
real 0m6.378s
user 0m48.648s
sys 0m0.000s