04.09.2020       Выпуск 350 (31.08.2020 - 06.09.2020)       Статьи

Немного Сythonа

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

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

Дошли руки до Cythona, спасибо самоизоляции. Проблема прозаична — как ускориться на python с минимальными потерями в синтаксисе. Один из подходов — использование Сython (смесь С и python).

Не давала покоя

публикация

с громким названием. Но из содержания публикации мало что можно вынести, так как формулы и результирующая таблица неверны. Попробуем дополнить картину, начатую авторами поста и расставим точки над и.

*Тесты проводились на 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, а файлов в папке будет меньше.

Как завести cython на windows.

Несмотря на то, что cython допускает сборку файлов как под python3, так и python2, получить готовый рецепт под python3 не удалось.

С python3 cтандартная команда сборки не работает:

python setup.py build_ext --inplace

Также не дает результата сборка с использованием стороннего компилятора mingw:

python setup.py build_ext -i --compiler=mingw32

*Не работают также варианты:

python setup.py build_ext -i --compiler=mingw32 -DMS_WIN64
и
python setup.py build_ext -i --compiler=msvc

Поэтому рабочий вариант, который позволит поработать в windows c cython, использует python2.7 и компилятор mingw.

Процедура следующая.

1.Устанавливаем сам cython:

pip install cython

2.Устанавливаем компилятор mingw:

mingw

3.После установки компилятора и добавления его в PATH windows файл формата .pyx можно собирать командой:

python setup.py build_ext -i --compiler=mingw32





Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus