将Rust从1.36.0更新到1.38.0后,我注意到我的程序运行速度较慢–降低了约50%。
使用perf,我发现alloc::vec::Vec<T>::retain新版本花费了一半的程序时间。在旧版本中,此功能甚至不会显示。为什么retain在1.38.0中需要花费更长的时间?
呼叫retain是这样完成的:
some_vec.retain(|&x| x < DEADLINE);
Run Code Online (Sandbox Code Playgroud)
deadline是一个常数u32,some_vec是一个Vec<u32>。
我retain在两个版本中都没有调用的情况下运行了该程序。在这种情况下,平均1.38.0仍然较慢,但仅降低了〜10%,而不是之前看到的> 50%。
回顾一下测试中发生的情况:
版本1.36.0
retain:〜18秒retain:〜11秒版本1.38.0
retain:〜28秒retain:〜12秒对于可重现的示例,您可以尝试:
use std::time::Instant;
fn main() {
let start = Instant::now();
let mut my_vec: Vec<u32>;
for _ in 0..100_000 {
my_vec = (0..10_000).collect();
my_vec.retain(|&x| x < 9000);
my_vec.retain(|&x| x < 8000);
my_vec.retain(|&x| x < 7000);
my_vec.retain(|&x| x < 6000); …Run Code Online (Sandbox Code Playgroud) 我想创建一个函数,返回一个数据结构,其中包含特定一组数字的所有可能组合:例如: for [1, 2, 3]return [[1], [2], [3], [1, 2], [2,1], ..., [1, 2, 3], [2, 1, 3], ...[3, 2, 1]]。
我理解 和c是p的某种向量&integer,但我找不到将它们保存到数组或向量中的方法。我试图将其保存为向量的向量,因为我认为不可能将它们保存为数组的向量,因为数组具有不同的大小。它也不可能作为向量数组,因为我不知道开始时的组合数量。
如何将所有c和存储p在数据结构中,以便可以在外部返回和使用?
use permutator::{Combination, Permutation}; // 0.3.3
pub fn init() -> Vec<Vec<u32>> {
let actions: Vec<Vec<u32>>;
let mut data = &[1, 2, 3];
let mut counter = 1;
for i in 1..=data.len() {
data.combination(i).for_each(|mut c| {
println!("{:?}", c);
actions.push(c);
c.permutation().for_each(|p| {
println!("k-perm@{} = {:?}", counter, p); …Run Code Online (Sandbox Code Playgroud) 尝试使用以下结构创建一棵 Rust 树:
pub struct Node{
pub children: Vec<Box<Node>>,
pub parent: Option<Box<Node>>,
pub value: f32,
//.....
}
Run Code Online (Sandbox Code Playgroud)
要构建新节点,请使用以下函数:
pub fn build_node(parent: Option<Box<Node>>)-> Node{
Node{
children: vec![],
parent,
value: 0.0,
}
}
Run Code Online (Sandbox Code Playgroud)
尝试添加节点时,例如:
let mut root_nd = tree::build_node(None, 5, state);
let mut next_nd = tree::build_node(Some(Box::new(root_nd)), 2);
root_nd.children.push(Box::new(next_nd));
Run Code Online (Sandbox Code Playgroud)
会有错误,因为我正在借用root_nd,然后尝试添加next_nd到root.children列表中,即使没有这个错误,我仍然需要next_nd在将其添加到 的子级后有一个参考root_nd。我知道在 Rust 中,同一个元素不可能同时拥有多个可变引用。所以问题是如何在 Rust 中创建一个具有双向引用的树状数据结构?在我看来,这是一个冲突,因为 Rust 不需要多个引用,但我需要树中间的一个节点被他的父节点和子节点引用。
我使用此代码为数字 0 到 49 创建了一个随机样本。现在我想为一组自定义值创建一个随机样本。例如:从 中选择 5 个样本[1, 2, 3, 4, 9, 10, 11, 14, 16, 22, 32, 45]。我怎样才能做到这一点?
use rand::{seq, thread_rng}; // 0.7.3
fn main() {
let mut rng = thread_rng();
let sample = seq::index::sample(&mut rng, 50, 5);
}
Run Code Online (Sandbox Code Playgroud)