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)
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