реклама
Бургер менюБургер меню

Кеннет Рейтц – Автостопом по Python (страница 56)

18

$ pip install subprocess32

В блоге Python Module of the Week вы можете найти отличное руководство по subprocess (https://pymotw.com/2/subprocess/).

PyPy

PyPy — это реализация Python на чистом Python. Она быстра; и когда она работает, вам не нужно больше ничего делать со своим кодом — он будет работать без дополнительных усилий. Вам следует воспользоваться этим вариантом в первую очередь.

Вы не можете получить ее с помощью команды pip, поскольку, по сути, это еще одна реализация Python. На странице загрузок PyPy http://pypy.org/download.html вы можете найти корректную версию реализации для вашей версии Python и операционной системы.

Существует модифицированная версия тестового кода, ограниченная по процессору, от Дэвида Бизли (David Beazley) (http://www.dabeaz.com/GIL/gilvis/measure2.py), в которую добавлен цикл для выполнения нескольких тестов. Вы можете увидеть разницу между PyPy и CPython.

Сначала запустим ее с помощью CPython:

$ # CPython

$./python — V Python 2.7.1

$

$./python measure2.py

1.0 67744 01665 1.4 54123 97385 1.5 14852 04697 1.5 46938 89618 1.6 01091 14647

А теперь запустим тот же сценарий, но изменим интерпретатор Python — выберем PyPy:

$ # PyPy

$./pypy — V Python 2.7.1 (7773f8fc4223, Nov 18 2011, 18:47:10)

[PyPy 1.7.0 with GCC 4.4.3]

$

$./pypy measure2.py

0.068 39990 61584 0.048 32100 86823 0.038 85889 05334 0.044 06905 17426 0.069 53001 02234

Получается, что благодаря простой загрузке PyPy мы сократили время работы сценария с 1,4 секунды до 0,05 — практически в 20 раз. Порой ваш код будет ускорен менее чем в два раза, но иногда вы сможете значительно его ускорить. И для этого не нужно прикладывать никаких усилий, за исключением загрузки интерпретатора PyPy. Если хотите, чтобы ваша библиотека, написанная на C, была совместима с PyPy, следуйте советам PyPy (http://pypy.org/compat.html) и используйте CFFI вместо ctypes из стандартной библиотеки.

Cython

К сожалению, PyPy работает не со всеми библиотеками, использующими расширения, написанные на C. Для этих случаев Cython (произносится «сайтон» — это не то же самое, что CPython, стандартная реализация Python, созданная с помощью C) (http://cython.org/) реализует superset языка Python (можно писать модули Python на C и C++). Cython дает возможность вызывать функции из скомпилированных библиотек на C и предоставляет контекст nogil, позволяющий обойти GIL для раздела кода (он не манипулирует объектами Python) (http://tinyurl.com/cython-nogil). Применяя Cython, вы можете воспользоваться преимуществами строгого типизирования в Python[102] переменных и операций.

Рассмотрим пример строгой типизации с помощью Cython:

def primes(int kmax):

"""Расчет простых чисел с помощью дополнительных ключевых слов Cython """

····cdef int n, k, i

····cdef int p[1000]

····result = []

····if kmax > 1000:

········kmax = 1000

····k = 0

····n = 2

····while k < kmax:

········i = 0

········while i < k and n % p[i]!= 0:

············i = i + 1

········if i == k:

············p[k] = n

············k = k + 1

············result.append(n)

········n = n + 1

····return result

Эта реализация алгоритма поиска простых чисел содержит дополнительные ключевые слова. Следующий пример написан на чистом Python:

def primes(kmax):

""" Расчет простых чисел с помощью стандартного синтаксиса Python """

····p= range(1000)

····result = []

····if kmax > 1000:

········kmax = 1000

····k = 0

····n = 2

····while k < kmax:

········i = 0

········while i < k and n % p[i]!= 0:

············i = i + 1

········if i == k:

············p[k] = n

············k = k + 1

············result.append(n)

········n = n + 1

····return result

Обратите внимание: в версии Cython вы объявляете, что целые числа и массивы целых чисел будут скомпилированы в типы C, в то же время будет создан список Python:

Тип объявляется как целое число.

Переменные n, k и i объявляются как целые числа.

Мы заранее выделяем память для массива целых чисел p размером в 1000 элементов.