В этой статье мы сравним два языка, Rust и Python, обсудим варианты их использования, рассмотрим плюсы и минусы использования Rust и Python и объясним, почему Rust набирает популярность (и может даже заменить Python).

1 Что такое ржавчина?

Rust — это язык системного программирования, ориентированный на безопасность, особенно безопасность параллелизма, и поддерживающий мультипарадигмальные языки, такие как функциональные, императивные и общие парадигмы программирования. Rust синтаксически похож на C++, но разработчики хотели обеспечить лучшую безопасность памяти при сохранении производительности. Первоначально Rust был разработан и создан Грейдоном Хоаром из Mozilla Research и со временем совершенствовался при участии Дэйва Хермана, Брендана Эйха и многих других. Разработчики Rust оптимизировали язык Rust и компилятор Rust, основываясь на своем опыте разработки механизма компоновки для веб-браузера Servo.

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

Rust был выпущен в 2010 году. Хотя Rust — молодой язык по сравнению с Python, его сообщество неуклонно растет. Фактически, в течение пяти лет подряд (2016, 2017, 2018, 2019, 2020) Rust выигрывал титул «Самый любимый язык программирования» в опросе разработчиков Stack Overflow.

На первый взгляд, статическая и строгая типизация Rust может показаться немного экстремальной. Но в долгосрочной перспективе это помогает предотвратить неожиданное поведение кода.

02 Что такое Python?

Python — это язык программирования, призванный помочь разработчикам работать более эффективно и более эффективно интегрировать системы. Python предоставляет эффективные высокоуровневые структуры данных и простое и эффективное объектно-ориентированное программирование. Синтаксис и динамическая типизация Python, а также природа интерпретируемых языков делают его языком программирования для сценариев и быстрой разработки приложений на большинстве платформ. Благодаря постоянному обновлению версий и добавлению новых языковых функций он постепенно используется для разработки самостоятельных и масштабных проектов. Если скорость имеет первостепенное значение, можно использовать вызовы API более низкого уровня, такие как CPython.

Представленный Гвидо ван Россумом в 1991 году, Python отличается читабельностью кода, отсутствием точек с запятой и фигурных скобок.

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

03 Когда использовать Rust

Rust используется при разработке систем, операционных систем, корпоративных систем, приложений микроконтроллеров, встроенных систем, файловых систем, компонентов браузера, механизмов моделирования виртуальной реальности и многого другого.

Rust является широко используемым языком, когда важна производительность, потому что он хорошо обрабатывает большие объемы данных. Он может обрабатывать операции с интенсивным использованием ЦП, такие как выполнение алгоритмов, поэтому Rust лучше подходит для разработки системы, чем Python.

Rust гарантирует безопасность памяти и позволяет контролировать поведение потоков и распределение ресурсов между потоками. Это позволяет создавать сложные системы, а также дает Rust преимущество перед Python.

Таким образом, вы должны использовать Rust, когда:

  • Вашему проекту нужна высокая производительность
  • Вы строите сложные системы
  • Вы цените безопасность памяти выше простоты

04 Когда использовать Python

Python можно использовать во многих областях применения, от веб-разработки до науки о данных и аналитики, от искусственного интеллекта и машинного обучения до разработки программного обеспечения.

Python широко используется в машинном обучении, науке о данных и искусственном интеллекте, потому что он:

  • Просто и легко
  • Гибкий
  • Содержит большое количество ориентированных на данные пакетов и библиотек.
  • Поддерживается отличной экосистемой инструментов и библиотек

Вы должны использовать Python, когда:

  • Вам нужен гибкий язык для поддержки веб-разработки, науки о данных и аналитики, а также машинного обучения и искусственного интеллекта.
  • Вы цените удобочитаемость и простоту
  • Вам нужен удобный для начинающих язык
  • Вы предпочитаете простоту синтаксиса и скорость разработки производительности

05 Почему Rust может заменить Python

Учитывая быстрое внедрение, популярность и широкий спектр вариантов использования Rust, почти неизбежно, что в ближайшем будущем он обгонит Python, и вот несколько причин, почему.

Производительность

Одной из основных причин, по которой Rust превосходит Python, является производительность. Поскольку Rust компилируется непосредственно в машинный код, между вашим кодом и вашим компьютером нет виртуальной машины или интерпретатора.

Еще одним ключевым преимуществом перед Python является многопоточность Rust и управление памятью. Хотя в Rust нет сборки мусора, как в Python, компилятор в Rust принудительно проверяет недопустимые утечки ссылок на память и другое опасное или нестандартное поведение.

Компилируемые языки обычно быстрее, чем интерпретируемые языки. Но что ставит Rust на другой уровень, так это то, что он почти так же быстр, как C и C++, без дополнительных накладных расходов.

Давайте рассмотрим пример программы O(log n), написанной на Python, и воспользуемся итеративным подходом для расчета времени, необходимого для выполнения задачи:

import random 
import datetime 
def binary_searcher(search_key, arr): 
  low = 0 
  high = len(arr)-1 
  while low <= high: 
    mid = int(low + (high-low)//2) 
    if search_key == arr[mid]: 
      return True 
    if search_key < arr[mid]: 
      high = mid-1 
      elif search_key > arr[mid]: 
        low = mid+1 
return False 

Выход:

> python -m binny.py 
It took 8.6μs to search

В то же время, давайте посмотрим на программу O(log n), написанную на Rust с использованием итеративного подхода:

>use rand::thread_rng; 
use std::time::Instant; 
use floating_duration::TimeFormat; 
 
fn binary_searcher(search_key: i32, vec: &mut Vec<i32>) -> bool { 
  let mut low: usize = 0; 
  let mut high: usize = vec.len()-1; 
  let mut _mid: usize = 0; 
  while low <= high { 
    _mid = low + (high-low)/2; 
    if search_key == vec[_mid] { 
      return true; 
    } 
    if search_key < vec[_mid] { 
      high = _mid - 1; 
    } else if search_key > vec[_mid] { 
      low = _mid + 1; 
    } 
  } 
  return false; 
} 
 
fn main() { 
  let mut _rng = thread_rng(); 
  let mut int_vec = Vec::new(); 
  let max_num = 1000000; 
 
  for num in 1..max_num { 
    int_vec.push(num as i32); 
  } 
  let start = Instant::now(); 
  let _result = binary_searcher(384723, &mut int_vec); 
  println!("It took: {} to search", TimeFormat(start.elapsed())); 
} 

Выход:

> cargo run 
Finished dev [unoptimized + debuginfo] target(s) in 0.04s 
Running target\debug\algo_rusty.exe 
It took: 4.6μs to search

Без использования каких-либо методов оптимизации Rust и Python выполняют аналогичную операцию на одном компьютере за 4,6 и 8,6 микросекунд соответственно. Это означает, что Python занимает почти вдвое больше времени, чем Rust.

Управление памятью

Python, как и большинство современных языков программирования, предназначен для безопасного использования памяти. Впрочем, даже без сборки мусора. Rust оставляет Python далеко позади, когда дело доходит до безопасности памяти.

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

Проверка ошибок и диагностика

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

Вот типичный пример ошибки переменной Python:

apple = 15  
print('The available apples are:', aple) 

Выход:

Traceback (most recent call last): 
    File "binny.py", line 2, in <module> 
      print('The available apples are:', aple) 
    NameError: name 'aple' is not defined

Аналогичный пример в Rust:

fn main() { 
  let apple = 15; 
  println!("The available apples are:", aple); 
}

Выход:

println!("The available apples are:", aple); 
   ^^^^ help: a local variable with a similar name exists: `apple`

Здесь Rust предлагает возможные переменные, которые вы, возможно, захотите импортировать. Python просто выдает ошибки, не давая советов, как их исправить.

Другой пример:

fn main() { 
  let grass = 13; 
 
  grass += 1; 
}

Этот код выдает ошибку, потому что переменные в Rust по умолчанию неизменяемы. Его нельзя изменить, если в нем нет ключевого слова mut.

Ошибка:

let grass = 13; 
      |         ----- 
      |         | 
      |         first assignment to `grass` 
      |         help: make this binding mutable: `mut grass`

Как исправить:

fn main() { 
  let mut _grass: i32 = 13; 
 
  _grass += 1; 
}

Как видите, теперь он не выдает никаких ошибок. Кроме того, Rust не позволяет взаимодействовать разным типам данных, если они не преобразованы в один и тот же тип.

Поэтому поддерживать кодовую базу Rust обычно несложно. Rust не допускает изменений, если не указано иное. Python допускает изменения такого рода.

Rust популярен за его скорость, гарантированную безопасность памяти, превосходную надежность, согласованность и удобство для пользователя по сравнению с большинством компилируемых языков. В программировании мы достигли точки, когда скорость становится легкой.

По мере развития технологий они становятся все быстрее и быстрее, пытаясь сделать больше за меньшее время без большого количества компромиссов. Rust помогает сделать это возможным, не мешая разработчикам. Когда технология пытается раздвинуть границы возможного, она также учитывает безопасность и надежность системы, что является основной идеей Rust.

параллельные вычисления

Помимо скорости, у Python также есть ограничения, когда речь идет о параллельных вычислениях.

Python использует глобальную блокировку интерпретатора (GIL), которая поощряет одновременное выполнение только одного потока для повышения однопоточной производительности. Это большое ограничение, потому что это означает, что вы не можете использовать несколько ядер ЦП для интенсивных вычислений.

Сообщество

Как упоминалось ранее, 86% респондентов «Опроса разработчиков 2020 года», проведенного Stack Overflow, назвали Rust своим любимым языком программирования в 2020 году.

Аналогичным образом, респонденты отчета HackerRank о навыках разработчиков за 2020 год назвали Rust в числе 10 лучших языков программирования, которые они планируют изучить в будущем.

Эти цифры показывают, что Rust становится частью основного сообщества разработчиков. Rust используется многими крупными компаниями, а некоторые разработчики даже используют его для создания библиотек, используемых в других языках программирования. Известные пользователи Rust включают Mozilla, Dropbox, Atlassian, npm и Cloudflare, и это лишь некоторые из них.

Amazon Web Service также приняла Rust для чувствительных к производительности компонентов в Lambda, EC2 и S3. В 2019 году AWS объявила о своем спонсорстве проекта Rust и с тех пор предоставила AWS SDK для Rust.

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

06 Резюме

Rust превратился в простой в использовании язык программирования, поэтому его использование увеличилось. Хотя Python прочно присутствует в сообществе машинного обучения и науки о данных, Rust, скорее всего, будет использоваться в качестве более эффективного бэкенда для библиотек Python в будущем.

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