| Crates.io | memoiz |
| lib.rs | memoiz |
| version | 0.2.2 |
| created_at | 2025-05-24 04:30:35.333809+00 |
| updated_at | 2025-06-21 14:20:58.997957+00 |
| description | A Rust attribute macro for automatic memoization (caching) of function results, optimizing recursive and repetitive computations with thread-safe lazy initialization. |
| homepage | |
| repository | https://github.com/withRiver/memoiz |
| max_upload_size | |
| id | 1687001 |
| size | 13,711 |
memoiz - 自动记忆化搜索宏memoiz 是一个 Rust 属性宏,用于将函数转换为记忆化搜索(memoization),通过缓存函数调用结果,避免重复计算,显著优化递归函数性能。
该宏适用于需要减少重复计算的场景(如斐波那契数列、动态规划问题),且支持多线程安全(内部使用 Mutex 保护缓存)。
Mutex 实现,支持多线程并发访问。Clone + PartialEq + Eq + Hash(默认要求)。v0.2: 参数中的不可变引用参数不会被缓存,从而支持了被标注函数参数中有不可变引用(如Vec, Slice等不可变引用)的使用场景。
use memoiz::memo;
#[memo]
fn fib(n: u32) -> u32 {
if n <= 1 {
n
} else {
fib(n - 1) + fib(n - 2)
}
}
fn main() {
assert_eq!(fib(10), 55);
}
use std;
use memoiz::memo;
#[memo]
fn f(nums: &Vec<i32>, n: usize) -> i32{
if n == 0 {
return 0;
}
if n == 1 {
return nums[0];
}
return std::cmp::max(f(nums, n - 2) + nums[n - 1], f(nums, n - 1));
}
fn main() {
let nums = vec![2, 7, 9, 3, 1];
assert_eq!(f(&nums, nums.len()), 12)
}
参数类型要求:
Clone + PartialEq + Eq + Hash,否则无法作为缓`存键。Vec<u8>),需手动包装或改用其他缓存策略。(若在每次递归调用中该参数值不变,那么可以传入不可变引用)线程安全:
Mutex 保护,确保多线程环境下安全访问。性能权衡:
递归限制:
#[memo]:直接标注在函数上,自动生成缓存逻辑。
在 Cargo.toml 中添加依赖:
[dependencies]
memoiz = "0.1.0"