Crates.io | memoise |
lib.rs | memoise |
version | 0.3.2 |
source | src |
created_at | 2020-02-01 05:02:17.983739 |
updated_at | 2020-03-08 06:59:46.36523 |
description | Simple memoization library for rust |
homepage | |
repository | https://github.com/tanakh/memoise |
max_upload_size | |
id | 203843 |
size | 26,426 |
Simple memoization library for rust
Find it on docs.rs.
Add this to your Cargo.toml
:
[dependencies]
memoise = "0.3"
And then, just add memoise
attribute to functions you want to memoise:
use memoise::memoise;
#[memoise(n <= 100)]
fn fib(n: i64) -> i64 {
if n == 0 || n == 1 {
return n;
}
fib(n - 1) + fib(n - 2)
}
And you can call it normally:
fn main() {
println!("{}", fib(45));
}
And run it:
$ cargo build --release
$ time cargo run --release -q
1134903170
real 0m0.039s
user 0m0.000s
sys 0m0.016s
If comment out memoise
attribute, it will not be memoised.
// #[memoise(n <= 100)]
fn fib(n: i64) -> i64 {
if n == 0 || n == 1 {
return n;
}
fib(n - 1) + fib(n - 2)
}
$ cargo build --release
$ time cargo run --release -q
1134903170
real 0m5.019s
user 0m4.984s
sys 0m0.016s
When no bounds for keys given, the cache table Vec
will be allocated dynamically.
use memoise::memoise;
// the cache table for `n` is dynamically allocated
#[memoise(n)]
fn fib(n: i64) -> i64 {
if n == 0 || n == 1 {
return n;
}
fib(n - 1) + fib(n - 2)
}
_reset
function frees allocated Vec
.
fib(42); // This allocates cache table for `0..n+1`
fib_reset();
memoise_map
memoises a function by using BTreeMap
.
It is suitable for keys are sparse.
#[memoise_map(n)]
fn fib(n: i64) -> i64 {
if n == 0 || n == 1 {
return n;
}
fib(n - 1) + fib(n - 2)
}
_reset
function also releases all allocated memory.
For more information, you can find a document on docs.rs.