πŸβš™οΈ Python ΠΈΠ»ΠΈ Rust: Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинного обучСния

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Python Π² Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ML ΡƒΠΆΠ΅ нСоспорима, ΠΎΠ΄Π½Π°ΠΊΠΎ быстрорастущая Π·Π²Π΅Π·Π΄Π° Rust Π³ΠΎΡ‚ΠΎΠ²Π° Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π΅ΠΌΡƒ Π²Ρ‹Π·ΠΎΠ².

Python стал основным языком машинного обучСния ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… благодаря своСй простотС, гибкости ΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Python ΠΈΠ΄Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π½Π° любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, ΠΈ хотя Python довольно часто ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ с R ΠΈ Julia, Π½ΠΈ Ρ‚ΠΎΡ‚, Π½ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. НСдавно Ρƒ Python появился Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ – Rust. Он Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС Python, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… прСимущСства – высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, сопоставимая с C/C++, ΠΈ максимально Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ обСспСчСния бСзопасности. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ML-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ для сСбя Π΄ΠΈΠ»Π΅ΠΌΠΌΡƒ – ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· этих языков Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ особСнности Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сдСлали Π΅Π³ΠΎ фактичСским стандартом Π² AI/ML ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, с вСскими прСимущСствами восходящСй Π·Π²Π΅Π·Π΄Ρ‹ Rust.

🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🧩🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

НаслСдиС Python

Python ΠΈΠΌΠ΅Π΅Ρ‚ простой ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° Π² ΡˆΡƒΡ‚ΠΊΡƒ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ исполняСмым псСвдокодом. Π­Ρ‚Π° простота ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ³Π»ΡΠ½ΡƒΠ»ΠΈΡΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Ρ‚Π°Π»Π°Π½Ρ‚Π»ΠΈΠ²Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ: ΠΎΠ½ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ всСвозмоТныС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Python ΠΎΡ‡Π΅Π½ΡŒ быстро обзавСлся Π½Π΅ΠΎΠ±ΡŠΡΡ‚Π½ΠΎΠΉ экосистСмой, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ инструмСнты для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π»ΡŽΠ±Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. НС всС эти Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ максимально эффСктивно – ΠΈΠ·-Π·Π° нСвысокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Python Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… 3D-ΠΈΠ³Ρ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – Π½ΠΎ для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, машинного обучСния ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ скорости языка Π²ΠΏΠΎΠ»Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ критичСски Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π‘ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ просто выглядит Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· CSV-Ρ„Π°ΠΉΠ»Π° Π² Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Pandas:

import pandas as pd
data = pd.read_csv("mydataset.csv")
print(data.head())

Новый ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ – Rust

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΠ»ΡŽΡΡ‹ Rust – высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. Он ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для систСмного программирования, ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π² сСрвСрной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Π³Π΅ΠΉΠΌΠ΄Π΅Π²Π΅. Rust – Π½Π΅ самый ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинного обучСния. Однако Π² послСдниС нСсколько Π»Π΅Ρ‚, благодаря своим вСским прСимущСствам, ΠΎΠ½ всС Ρ‡Π°Ρ‰Π΅ примСняСтся ΠΈ Π² этих областях – хотя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ слоТнСС. Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого CSV-Ρ„Π°ΠΉΠ»Π° Π² Rust выглядит Ρ‚Π°ΠΊ:

use std::error::Error;
use csv::ReaderBuilder;

fn main() -> Result<(), Box<dyn Error>> {
    let file = std::fs::File::open("mydataset.csv")?;
    let mut rdr = ReaderBuilder::new().has_headers(true).from_reader(file);

    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

Python ΠΈΠ»ΠΈ Rust: Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅

Python извСстСн ΠΏΠ»Π°Π²Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ обучСния: с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ знаниями языка ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ скрипты, Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ слоТных ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΌ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Pyhton идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚:

  • БпСциалистам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ программирования Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ – Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹Π΅.
  • Новичкам, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.
# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π° Python
print("Hello, World!")

Rust, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слишком слоТным для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…: Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ нСпростыС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΎΡΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ сразу, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, систСмы владСния ΠΈ заимствования:

  • БистСма владСния Π² Rust ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π΅Π³ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ошибки, связанныС с ΡƒΡ‚Π΅Ρ‡ΠΊΠΎΠΉ памяти ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌ освобоТдСниСм рСсурсов.
  • БистСма заимствования позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ рСсурс Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах ΠΊΠΎΠ΄Π° Π±Π΅Π· нСобходимости Π΅Π³ΠΎ копирования. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ тратятся рСсурсы Π½Π° созданиС Π»ΠΈΡˆΠ½ΠΈΡ… ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Однако эти ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… особСнностСй Rust, ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠΌ быстрым, бСзопасным ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎΡ‚ случай, ΠΊΠΎΠ³Π΄Π° усилия, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ языка, Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ компСнсированы качСством ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π° Rust
fn main() {
   println!("Hello, World!");
}

Rust ΠΈΠ»ΠΈ Python: Ρ‡Ρ‚ΠΎ быстрСС

Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Rust ΠΈ Python Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ. НапишСм рСкурсивный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычисляСт ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 35 чисСл Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° это вычислСниС.

ВычислСниС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ Π½Π° Rust:

use std::time::Instant;

fn fibonacci(n: u32) -> u32 {
  match n {
      0 => 0,
      1 => 1,
      _ => fibonacci(n - 1) + fibonacci(n - 2),
  }
}

fn main() {
  let start_time = Instant::now();

  for i in 0..35 {
      println!("{}", fibonacci(i));
  }

  let duration = start_time.elapsed();

  println!("ВрСмя выполнСния: {:.2} сСкунд", duration.as_secs_f64());
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
ВрСмя выполнСния: 0.05 сСкунд

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° Python:

import time

def fibonacci(n):
   if n <= 0:
       return 0
   elif n == 1:
       return 1
   else:
       return fibonacci(n-1) + fibonacci(n-2)

start_time = time.time()

for i in range(35):
   print(fibonacci(i))

end_time = time.time()

print(f"ВрСмя выполнСния : {end_time - start_time} сСкунд")

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
ВрСмя выполнСния : 7.8505754470825195 сСкунд

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Rust справился с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ быстрСС:).

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ

Π‘ экосистСмой Python слоТно ΡΠΎΠΏΠ΅Ρ€Π½ΠΈΡ‡Π°Ρ‚ΡŒ: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для матСматичСских вычислСний, Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹ΠΌΠΈ сСтями (Numpy, Pandas, TensorFlow, PyTorch, Scikit-Learn ΠΈ Ρ‚. Π΄.) стали стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ Π² индустрии Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Data Science ΠΈ ML/AI.

Однако Rust ΠΈ Π΅Π³ΠΎ экосистСма быстро Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ:

  • Π’ распоряТСнии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ndarray с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ NumPy Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.
  • Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ Pandas для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… – Polars.
  • Π•ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° statrs для статистичСских расчСтов ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°.
  • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Tangram ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для машинного обучСния ΠΈ прогнозирования.
  • Linfa, Autograd ΠΈ SmartCore ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΡ…ΠΎΠ΄Π½ΡƒΡŽ с PyTorch ΠΈ TensorFlow.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, PyTorch ΠΈ TensorFlow Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Rust, Π° список DS/ML/AI Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Rust, рСгулярно пополняСтся.

πŸ€– Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Data scientist’а
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Data scientist’а»
πŸ€–πŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Data Science для собСса
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ DS Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Data Science для собСса»
πŸ€–πŸ§© Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Data Science
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ DS для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Data ScienceΒ»

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΡΡ‚ΡŒ

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Python, Rust обСспСчиваСт Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ памяти: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Rust Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ случайно ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΌΡƒ адрСсу Π² памяти ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Rust Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΈ бСзопасным для использования Π² критичСских прилоТСниях.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Rust являСтся языком с ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠΉ модСлью выполнСния: нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π±Π΅Π· нСобходимости Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ синхронизации. Π­Ρ‚ΠΎ позволяСт Rust Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ высокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‡Π΅ΠΌ Python, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ….

Для создания ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ выполнСния Π·Π°Π΄Π°Ρ‡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Python ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ concurrent.futures ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

import concurrent.futures

def process_data(data_chunk):
    return data_chunk * 2

data_chunks = [1, 2, 3, 4, 5]

with concurrent.futures.ThreadPoolExecutor() as executor:
    future_to_data = {executor.submit(process_data, data_chunk): data_chunk for data_chunk in data_chunks}
    for future in concurrent.futures.as_completed(future_to_data):
        data_chunk = future_to_data[future]
        try:
            data = future.result()
        except Exception as exc:
            print(f'{data_chunk} ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: {exc}')
        else:
            print(f'{data_chunk} ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ: {data}')

Для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Rust ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Rayon:

use rayon::prelude::*;

fn process_data(data_chunk: &mut Vec<i32>) {
   *data_chunk = data_chunk.iter().map(|&x| x * 2).collect();
}

fn main() {
   let mut data_chunks: Vec<Vec<i32>> = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];

   data_chunks.par_iter_mut().for_each(|chunk| {
       process_data(chunk);
   });

   println!("{:?}", data_chunks);
}

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ Python ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ абстрагировано, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ простым для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ спСциалистов ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ…, Π° Π½Π΅ Π½Π° тонкостях использования памяти. Однако это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими объСмами ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ сборку мусора, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСэффСктивной для ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Π’ Rust Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, обСспСчивая эффСктивноС использованиС рСсурсов. Π­Ρ‚ΠΎ позволяСт Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • large_array создаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΈ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Vec. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ large_array ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° освобоТдСниС памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для Vec, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости.
  • sum создаСтся ΠΊΠ°ΠΊ ссылка Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° large_array.iter().sum(). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, sum Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π° просто ссылаСтся Π½Π° Π½ΠΈΡ….
  • Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main, ΠΊΠΎΠ³Π΄Π° large_array Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости, ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная для Vec, автоматичСски освобоТдаСтся. Π­Ρ‚ΠΎ гарантируСтся систСмой управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Rust, которая автоматичСски освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Π»Π°Π΄Π΅Π»Π΅Ρ† Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости.
fn main() {
   let mut large_array: Vec<f64> = vec![1.0; 1_000_000];
   let sum: f64 = large_array.iter().sum();
   println!("Π‘ΡƒΠΌΠΌΠ° элСмСнтов Ρ€Π°Π²Π½Π° {}", sum);
}

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

Π’ Python ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ threading ΠΈ multiprocessing, Π½ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ свои особСнности ΠΈ ограничСния. Π’ частности, ΠΈΠ·-Π·Π° Global Interpreter Lock (GIL) Π² Python, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСнсивно Π½Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ процСссор. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΌΠΎΠ΄ΡƒΠ»ΡŒ multiprocessing позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL, создавая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ процСссы, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΈ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ копию памяти. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΡΡ‚ΡŒ, которая являСтся Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°:

import multiprocessing
import time

def heavy(data, i, proc):
    for index in range(len(data)):
        data[index] += 1
    print(f"ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° β„– {i} ядро {proc}")

def sequential(calc, proc, data):
    print(f"ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊ β„– {proc}")
    for i in range(calc): 
       heavy(data, i, proc)
    print(f"{calc} ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ β„– {proc}")
 
 
def processesed(procs, calc):
   # procs - количСство ядСр
   # calc - количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π° ядро
 
   processes = []
   manager = multiprocessing.Manager()
   data = manager.list([num for num in range(1, 10)])
 
   # Π΄Π΅Π»ΠΈΠΌ вычислСния Π½Π° количСство ядСр
   for proc in range(procs):
       p = multiprocessing.Process(target=sequential, args=(calc, proc, data))
       processes.append(p)
       p.start()

 # ΠΆΠ΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° всС ядра Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ
   for p in processes:
       p.join()

   return data


start = time.time()
# ΡƒΠ·Π½Π°Π΅ΠΌ количСство ядСр Ρƒ процСссора
n_proc = multiprocessing.cpu_count()
# вычисляСм, сколько Ρ†ΠΈΠΊΠ»ΠΎΠ² вычислСний Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ
# Π½Π° 1 ядро, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² суммС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 80+
calc = 80 // n_proc + 1
data = processesed(n_proc, calc)
end = time.time()
print(f"ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ядСр Π² процСссорС: {n_proc}\n"
   f"На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ядрС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…: {calc}\n"
   f"Π˜Ρ‚ΠΎΠ³ΠΎ {n_proc * calc} ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ Π·Π°: {end - start}\n"
   f"ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅: {data}")

Π’ Rust Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Rayon, которая позволяСт Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅. Rayon Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ отсутствиС условий Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ идСально обСспСчиваСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вычислСний:

use rayon::prelude::*;
use num_cpus;

fn main() {
  let mut data: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];

  // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ количСство ядСр процСссора
  let num_cpus = num_cpus::get();

  // ВычисляСм количСство Ρ†ΠΈΠΊΠ»ΠΎΠ² вычислСний для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ядра
  let num_cycles = 80 / num_cpus + 1;

  // ВыполняСм Ρ†ΠΈΠΊΠ»Ρ‹ вычислСний
  for _ in 0..num_cycles {
      data.par_iter_mut().for_each(|x| {
          *x += 1;
      });
  }

  println!("{:?}", data);
}

Визуализация Π΄Π°Π½Π½Ρ‹Ρ…

Python располагаСт нСсколькими Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: Мatplotlib, Seaborn, Bokeh, Plotly, Altair ΠΈ Ρ‚.Π΄. Π‘Π°ΠΌΡ‹Π΅ популярныС ΠΈΠ· Π½ΠΈΡ… – Мatplotlib ΠΈ Seaborn. Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python максимально простой ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ:

import matplotlib.pyplot as plt

# Π”Π°Π½Π½Ρ‹Π΅
data = [1, 2, 3, 4, 5]

# Названия мСсяцСв
months = ['Π―Π½Π²Π°Ρ€ΡŒ', 'Π€Π΅Π²Ρ€Π°Π»ΡŒ', 'ΠœΠ°Ρ€Ρ‚', 'ΠΠΏΡ€Π΅Π»ΡŒ', 'Май']

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ
fig, ax = plt.subplots()

# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅
ax.plot(months, data)

# УстанавливаСм названия осСй
ax.set_xlabel('ΠœΠ΅ΡΡΡ†')
ax.set_ylabel('Π”Π°Π½Π½Ρ‹Π΅')

plt.show()

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π’ Rust для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ plotters:

use plotters::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let data = vec![1, 2, 3, 4, 5];
  let months = vec!["Π―Π½Π²Π°Ρ€ΡŒ", "Π€Π΅Π²Ρ€Π°Π»ΡŒ", "ΠœΠ°Ρ€Ρ‚", "ΠΠΏΡ€Π΅Π»ΡŒ", "Май"];

  let root = BitMapBackend::new("plot.png", (640, 480)).into_drawing_area();
  root.fill(&WHITE)?;

  let mut chart = ChartBuilder::on(&root)
      .caption("ΠœΠ΅ΡΡΡ‡Π½Π°Ρ статистика", ("Arial", 50).into_font())
      .margin(5)
      .x_label_area_size(30)
      .y_label_area_size(30)
      .build_cartesian_2d(months.iter().cloned().map(|m| m.to_string()).collect::<Vec<String>>(), 0..10)?;

  chart.configure_mesh().draw()?;

  chart.draw_series(LineSeries::new(
      data.iter().enumerate().map(|(i, &v)| (months[i].to_string(), v)),
      &BLUE,
  ))?;

  Ok(())
}

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования

Python ΠΌΠΎΠΆΠ΅Ρ‚ бСсшовно ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ C ΠΈ C++ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Cython. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² Python-ΠΊΠΎΠ΄Π΅.

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° my_lib Π½Π° C:

// my_lib.c
#include <stdlib.h>

int add(int a, int b) {
   return a + b;
}

Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

gcc -shared -o my_lib.so my_lib.c

И Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² Python:

from ctypes import CDLL

# Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
my_lib = CDLL('./my_lib.so')

# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add
result = my_lib.add(1, 2)
print(result) # Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: 3

Rust ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ возмоТности для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ C Ρ‡Π΅Ρ€Π΅Π· Foreign Function Interface (FFI). FFI позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС программирования, ΠΈΠ· ΠΊΠΎΠ΄Π° Π½Π° Rust. Π­Ρ‚ΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Rust с сигнатурой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, совмСстимой с C, ΠΈ Π·Π°Ρ‚Π΅ΠΌ динамичСского связывания с ΠΎΠ±Ρ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, содСрТащСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования FFI для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C ΠΈΠ· Rust
extern "C" {
   fn my_c_function(arg1: i32, arg2: f64) -> f64;
}

fn main() {
   let result = unsafe { my_c_function(42, 3.14) };
   println!("Result: {}", result);
}

Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π² Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, написанныС Π½Π° Rust, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π² Rust ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Python. ΠŸΡ€ΠΎΡ‰Π΅ всСго это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° PyO3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Python Π½Π° Rust. PyO3 обСспСчиваСт простоту ΠΈ удобство Π² создании привязок ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Rust ΠΈ Python. Π’ΠΎΡ‚ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания Python-модуля Π½Π° Rust:

// Rust ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ PyO3 для создания модуля Python
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn process(data: Vec<i32>) -> Vec<i32> {
   data.iter().map(|x| x * 2).collect()
}

#[pymodule]
fn rust_module(py: Python, m: &PyModule) -> PyResult<()> {
   m.add_function(wrap_pyfunction!(process, m)?)?;
   Ok(())
}

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² ΠΊΠΎΠ΄Π΅ Python ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

import rust_module

data = [1, 2, 3, 4, 5]
result = rust_module.process(data)
print(result) # Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: [2, 4, 6, 8, 10]

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

Π’Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ Rust для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинного обучСния – слоТная Π΄ΠΈΠ»Π΅ΠΌΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° языка ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ прСимущСства:

  • Python ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ максимально простым, понятным ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ синтаксисом, располагаСт ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΉ экосистСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² для машинного обучСния ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅.
  • Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Rust обСспСчиваСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ многопоточности ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°. Rust ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… ПО для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ выполнСния слоТных Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ Rust зависит ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… потрСбностСй ΠΈ уровня ΠΎΠΏΡ‹Ρ‚Π°. Если Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Python. Если Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования, Π° ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ нуТдаСтся Π² Π±ΠΎΠ»Π΅Π΅ высокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ бСзопасности, Ρ‚ΠΎ Rust Π±ΡƒΠ΄Π΅Ρ‚ самым подходящим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ.

***

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...