#python #type #fraction #deque #string #complex #dict

pyinrs

一个与Python内置类型一样容易使用的Rust类型库

17 个版本 (10 个稳定版)

1.8.0 2024年8月17日
1.7.0 2024年5月23日
1.3.0 2024年4月16日
1.1.0 2024年3月22日
0.7.0 2024年3月19日

#217 in 数据结构

每月 34 次下载
2 个crate中使用(通过 mymatrix

MITAGPL-3.0-or-later

66KB
1.5K SLoC

PyInRs

一个与Python内置类型一样容易使用的Rust类型库。

1. 属性

  • 名称:PyInRs。
  • 语言:Rust,需要版本 rustc >= 1.75.0
  • 目标:编写一个与Python内置类型一样容易使用的Rust类型库。
  • 模块:List、Set、Dict、Int、Str、Complex、Deque、Fraction
  • 风格:遵循Rust官方推荐风格。
  • 测试:使用 rstest 进行单元测试,并确保所有测试通过。
  • 安全性:没有 unsafe 代码块。
  • 文档:使用 cargo doc --open 打开文档。

2. 特性

  • 简单:保持简单,保持年轻。在确保友好和健壮的同时,尽量简洁且易于维护和阅读。
  • 友好:经过我的精心设计,它可以像Python的内置类型一样方便使用。非常Pythonic。
  • 健壮:对容器的插入、删除、修改和访问有相应的检查。
  • 效率:与标准库具有相同功能的部分的性能几乎相同。

3. 使用方法

要使用它,请将以下行添加到您的 Cargo.toml 文件中

[dependencies]
pyinrs = "1"

总共有8个类,参考Python中常用的类

PyInRs中的类型 Python中的类型
列表<T> list
集合<T> set
字典<K, V> dict
整数 int
字符串 str
复数 complex
双端队列<T> collections.deque
分数 fractions.分数

一些简单示例

use pyinrs::*;

// List support negative index
List::from([1, 2, 3, 4, 5])[-1]; // 5
// List uniquify
List::from([1, 2, 3, 1, 2, 3, 1, 2, 3]).uniquify(); // [1, 2, 3]

// test whether a Set is proper subset of another Set
Set::from([5, 1]) < Set::from([1, 2, 3, 4, 5]); // true
// intersection of Sets, support intersection, union, difference, and symmetric difference
Set::from([1, 2, 3, 4, 5]) & Set::from([1, 3, 5, 7, 9]); // {1, 3, 5}

// Dict access
Dict::from([("one", 1), ("two", 2), ("three", 3)])[&"one"]; // 1
// Dict get values as a Set
Dict::from([("one", 1), ("two", 2), ("three", 3)]).values().collect::<Set<&i32>>(); // {1, 2, 3}

// Int basic operation, support +, -, *, /, % and compare
Int::from("18446744073709551617") + Int::from("18446744073709551617"); // 36893488147419103234
// Int increment, after my optimization, much faster than `+= 1`
Int::from("99999999999999").inc(); // 100000000000000
// Int modular power, very fast
Int::pow_mod(&"1024".into(), &"1024".into(), &"100".into()); // 76
// Int factorial
Int::from("5").factorial().factorial(); // 66895029134491270575881180540903725867527463...
// get random Int, using hardware device to generate true random integer if possible
Int::random(4300); // 23795759214348387514699522496327832510939573336290225099601421311...
// calculate the next prime that greater than self
Int::new().next_prime();// 2

// Str split
Str::from("one, two, three").split(", "); // ["one", "two", "three"]
// Str join
Str::from(".").join(["192", "168", "0", "1"].into()); // "192.168.0.1"

// Complex addition
Complex::from((1., 2.)) + Complex::from((1., 3.)); // (2+5j)
// Complex power
Complex::pow(&Complex::from((1., 2.)), &Complex::from((-1., 2.))); // (0.04281551979798478+0.023517649351954585j)

// Deque element reference
Deque::from([1, 2, 3, 4, 5]).front(); // 1
// Deque rotate to right (or left), very vivid!
Deque::from([1, 2, 3, 4, 5]) >> 1; // <5, 1, 2, 3, 4>

// Fraction addition
Fraction::from((1, 2)) + Fraction::from((1, 3)); // 5/6
// Fraction modulo
Fraction::from((1, 2)) % Fraction::from((1, 3)); // 1/6

4. 优势

PyInRs 的优势在于它结合了 Rust 的高性能和 Python 的易用性,并且可以轻松与其他库结合使用,例如

use pyinrs::*;

// 1. All types can be printed and easily combined:
let dict: Dict<Str, List<Int>> = [
    ("first".into(), ["123".into(), "456".into()].into()),
    ("second".into(), ["789".into()].into()),
    ("third".into(), ["12345678987654321".into(), "5".into()].into()),
].into();
print!("{dict}"); // {"first": [123, 456], "second": [789], "third": [12345678987654321, 5]}
dict.keys().cloned().collect::<Set<Str>>(); // {"first", "second", "third"}
dict[&"third".into()][-1].factorial(); // 120

// 2. All container types are iterable:
for (k, v) in Dict::from([(1, 1), (2, 4), (3, 9)]) {
    assert_eq!(k * k, v);
}

// 3. All immutable types are hashable:
use std::collections::HashSet;
let _set1: HashSet<Int> = HashSet::from(["1".into(), "2".into(), "3".into(), "18446744073709551617".into()]);
let _set2: HashSet<Str> = HashSet::from(["hello".into(), "pyincpp".into()]);
let _set3: HashSet<Fraction> = HashSet::from([(1, 2).into(), (3, 4).into()]);

// 4. Using pyinrs::Fraction in mymatrix to display accurate matrix.
use mymatrix::Matrix;

let a = Matrix::from([[1, 2], [3, 4]]);
let b = Matrix::zeros(2, 2);
let c = Matrix::ones(2, 2);
let d = Matrix::eye(2);

print!("{}", ((a + b) * (c + d)).inv().unwrap());
/*
[
-11/6   5/6
  5/3  -2/3
]
*/

如果您想在 C++ 中使用类似的库,请参阅: PyInCpp.

依赖项

约 3.5–5MB
约 95K SLoC