Немного Сythonа

от автора

Дошли руки до Cythona, спасибо самоизоляции. Проблема прозаична — как ускориться на python с минимальными потерями в синтаксисе. Один из подходов — использование Сython (сместь С и python).
Не давала покоя публикация с громким названием отсюда — habr.com/ru/company/ruvds/blog/462487
Но из содержания публикации мало что можно вынести, так как формулы и результирующая таблица неверны. Попробуем дополнить картину, начатую авторами поста и расставим точки над и.

*Тесты проводились на odroid xu4, ubuntu mate, python 2.7.17.
Cython ставится просто (pip install cython).

Будем мучить все те же числа Фибоначчи.
Создадим файлы для тестов прироста производительности.
Для языка python (test.py):

def test(n):    a, b = 0.0, 1.0    for i in range(n):       a, b = a + b, a    print (a) 

Для языка cython(test2.pyx):

def test2(int n):    cdef int i    cdef double a=0.0, b=1.0    for i in range(n):       a, b = a + b, a    print (a) 

Файл cython требует предварительной сборки.
Для него создадим setup.py c содержимым:

from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize('test2.pyx')) 

И соберем:

python setup.py build_ext --inplace 

Теперь возьмем файл из упомянутого поста с тестами и немного его поправим, добавив возможность вводить собственное число на старте (tests.py):

import test import test2 import time  number = input('enter number: ')  start = time.time() test.test(number) end =  time.time()  py_time = end - start print("Python time = {}".format(py_time))  start = time.time() test2.test(number) end =  time.time()  cy_time = end - start print("Cython time = {}".format(cy_time)) print("Speedup = {}".format(py_time / cy_time)) 

Посмотрим, что получилось:

python tests.py 

Результаты:

Числа в вычислениях совпадают.
Прирост скорости ощутим, хотя и не такой заоблачный, как ожидалось.

*Можно обойтись без сборки test2.pyx с использованием setup.py, для этого необходимо просто в файл tests.py добавить строки:

import pyximport pyximport.install() 

Теперь test2.pyx будет собираться на лету при каждом запуске tests.py, а файлов в папке будет меньше.

ссылка на оригинал статьи https://habr.com/ru/post/517770/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *