Кеннет Рейтц – Автостопом по Python (страница 56)
$ 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: