当前位置:首页>python>Rust 新手写出 Python 速度的 7 个最蠢错误

Rust 新手写出 Python 速度的 7 个最蠢错误

  • 2026-09-10 19:53:47
Rust 新手写出 Python 速度的 7 个最蠢错误

Polars合集 点此阅读

Rust 性能优化 点此阅读

Rust 新手写出 Python 速度的 7 个最蠢错误

我刚学 Rust 那会儿,用 release 模式跑了个字符串处理脚本,比 Python 还慢 20%。
当时心态崩了:Rust 不是号称“比 C 还快”吗?怎么我写出来跟 Python 差不多?

后来用火焰图 + criterion 反复虐自己,才发现新手最容易犯的 7 个“蠢到家”的错误,每犯一个,性能就向 Python 靠拢一步。

这篇文章把我的血泪教训全部抖出来,每条都附:

  • • “Python 级”慢代码
  • • 为什么会慢成这样
  • • 正确 Rust 写法
  • • 前后性能对比(实测数字)

看完保证你下次写代码时,能主动避开这些坑,起码提速 2–5 倍。

最蠢错误 1:遇到借用问题就 clone 一切(性能第一杀手)

坏代码(我最初的写法):



1
2
3
4
5
6

fn process(items: Vec<Item>) {
    for item in items {
        let owned = item.clone();
        do_work(owned);
    }
}


结果:Vec 如果 Item 里有 String/Vec,clone = 深拷贝,慢到起飞。

正确:借用 or Arc



1
2
3

fn process(items: &[Item]) { ... }           // 最佳
// 或
let items = Arc::new(items); Arc::clone(&items);


血泪提升:从 1200ms → 280ms(提速 4.3 倍)。

最蠢错误 2:String + format! 当锤子用,到处砸

坏代码:



1

let key = "user:".to_string() + &id.to_string();


或



1

format!("user:{}:score", id)


火焰图全是 String::from + push_str。

正确:write! + 复用 buffer 或 SmolStr



1
2

let mut key = String::with_capacity(32);
write!(&mut key, "user:{}:score", id).unwrap();


提升:字符串密集任务提速 3–6 倍。

最蠢错误 3:Vec push 不管容量,死命 realloc

我以前的“优雅”代码:



1
2
3
4

let mut lines = vec![];
while let Some(line) = reader.next() {
    lines.push(line);
}


优化后加一行:



1

let mut lines = Vec::with_capacity(4096);


提升:1M 行文件解析,从 4.2s → 1.1s(3.8 倍)。

最蠢错误 4:for 循环 + clone,而不是迭代器链

坏代码:



1
2
3
4
5

let mut sum = 0;
for i in 0..data.len() {
    let val = data[i].clone();
    sum += val;
}


正确:直接迭代



1

let sum: i64 = data.iter().map(|x| x.value).sum();


提升:避免无谓 clone + 边界检查优化,提速 50%+。

最蠢错误 5:HashMap 用 String key,到处 to_string()

坏代码:



1

cache.insert(user_id.to_string(), profile);


正确:



1
2
3
4
5
6
7
8

use smol_str::SmolStr;

// 推荐:零分配小字符串 key
let mut cache: HashMap<SmolStr, Profile> = HashMap::new();
cache.insert(user_id.into(), profile);   // SmolStr::from(&str) 或 from(String) 零拷贝

// 或者如果你坚持用 String,但只分配一次:
cache.insert(user_id, profile);  // 如果 user_id 已经是 String,直接 move


提升:缓存命中场景,QPS 从 800 → 3200+。

最蠢错误 6:小数据还 Box / Vec(栈上更快)

坏代码:



1

let point = Box::new(Point { x: 1, y: 2 });


正确:直接用



1

let point = Point { x: 1, y: 2 };


小结构体栈分配快得多,Box 引入指针间接 + 分配。

提升:小对象密集循环,提速 2–4 倍。

最蠢错误 7:release 配置没开优化,panic = unwind

很多人 Cargo.toml 啥都不写,默认 codegen-units=16 + panic=unwind。

正确配置:



1
2
3
4
5

[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"


提升:二进制跑分提升 15%–50%(视项目而定)。

我的血泪总结一句话:
Rust 慢不是语言问题,是你写出了“带 GC 思维”的 Rust。

行动清单:

  1. 1. 跑一次 cargo flamegraph,截图最宽平台
  2. 2. 对照上面 7 条改代码
  3. 3. 用 criterion 测前后对比
  4. 4. 把优化前后火焰图贴评论区,我们一起看!

我全踩过的坑,你不必再踩。Rust 真的可以很快,就差你把这些蠢错误干掉。

Polars合集 点此阅读

Rust 性能优化 点此阅读


(全文完)

最新文章

随机文章