Привет, хабровчане. В преддверии старта курса "Python Developer. Basic" подготовили для вас перевод интересной статьи. Также приглашаем на открытый вебинар «Карьера для "Python Developer. Basic"».
Python — один из самых популярных и доступных языков программирования, но далеко не самый быстрый. Многие создатели библиотек и фреймворков прибегали к использованию расширения на С, чтобы их код работал быстрее, чем код на нативном Python. Этот способ вполне рабочий, но если вы не знакомы с С, сборка мусора и управление памятью станут вашим адом на Земле. И тут на сцену выходит Nim.
Что такое Nim?
Nim – статически типизированный, компилируемый, объектно-ориентированный язык программирования. Nim создавался, чтобы быть таким же быстрым как С и таким же выразительным как Python, и к тому же, расширяемым как Lisp. Благодаря синтаксическому сходству с Python, Nim станет отличным выбором языка для расширения, если с C вам не по пути.
Начало работы с Nim
Чтобы начать писать на Nim, его нужно установить в свою систему. Скачайте и установите его с сайта nim-lang.org.
Как только вы закончите, мы начнем писать свой первый код на Nim. Во-первых, мы создаем файл, я назову его hello.nim, а вы можете назвать его как захотите. Теперь мы откроем его в любом текстовом редакторе и напишем:
static:
echo("Hello, world!")
Сохраните и закройте файл, затем откройте терминал из текущей директории и введите:
nim compile hello.nim
И вуаля! В консоль выведется «Hello, World!». После получения первого представления о Nim перейдем к основной теме статьи.
Встраиваем Nim в приложения на Python
Nim поставляется с модулем nimpy
и nimporter
, которые доступны для Python. Последний можно установить с помощью pip install nimporter
. Эти два пакета будут иметь важное значение при совместной работе двух языков.
Чтобы продемонстрировать возможности Nim, мы создадим простой тест, который будет сравнивать скорость работы обоих языков, на примере функции находящей n-ое число последовательности Фибоначчи.
Давайте создадим папку под названием Benchmark с 3 файлами внутри:
main.py
— файл, который мы будем запускатьnmath.nim
— файл с версией функцииfib
на Nimpmath.py
— файл с версией функцииfib
на Python
Сначала напишем функцию fib на Python:
def fib(n):
if n == 0:
return 0
elif n < 3:
return 1
return fib(n - 1) + fib(n - 2)
А теперь переместимся в nmath.nim
. Для начала нам нужно импортировать nimpy
:
import nimpy
Прямо как в Python, не так ли? А теперь сама функция:
import nimpy
proc fib(n: int): int {.exportpy.} =
if n == 0:
return 0
elif n < 3:
return 1
return fib(n-1) + fib(n-2)
Давайте разберемся
Мы определяем функцию fib
с помощью ключевого слова proc
. Дальше указываем тип возвращаемого значения как целочисленный, а (вау, что это такое?) {.exportpy.}
сигнализирует Nim, что эта функция предназначена для использования в другом модуле Python. В остальном все также, как в Python.
Тестирование на время
В main.py создадим простой бенчмарк:
import nimporter
from time import perf_counter
import nmath # Nim imports!
import pmath
print('Measuring Python...')
start_py = perf_counter()
for i in range(0, 40):
print(pmath.fib(i))
end_py = perf_counter()
print('Measuring Nim...')
start_nim = perf_counter()
for i in range(0, 40):
print(nmath.fib(i))
end_nim = perf_counter()
print('---------')
print('Python Elapsed: {:.2f}'.format(end_py - start_py))
print('Nim Elapsed: {:.2f}'.format(end_nim - start_nim))
Вот и все!
Пакет nimporter
позволяет импортировать Nim в обычные модули Python, которые будут использоваться также, как и собственные. Круто, не правда ли?
Чтобы запустить код, просто введите python main.py
в командную строку и смотрите, что будет!
Python Elapsed: 33.60
Nim Elapsed: 1.05
Заключение
Вот и все, что нужно сделать, чтобы быстро встроить Nim в Python. Nim оказался примерно в 30 раз быстрее, но имейте ввиду, что разница в скорости может варьироваться в зависимости от выполняемой задачи. Чтобы узнать больше о Nim, рекомендую ознакомиться с официальной документацией и почитать про него в Википедии.
Что ж, на этом я закончу свой туториал! Спасибо, что дотерпели до конца. Надеюсь, эта статья окажется для вас полезной.
Узнать подробнее о курсе "Python Developer. Basic".
Смотреть запись открытого demo-урока «Три кита: map(), filter() и zip()».