Python与Rust性能对比分析后端转 Rust 的萌新ID 第一程序员——名字大人很菜暂时。正在跟所有权和生命周期死磕日常记录 Rust 学习路上的踩坑经验和啊哈时刻代码片段保证能跑。保持学习保持输出。欢迎大佬们轻喷也欢迎同好一起进步。前言最近在学习 Rust 的过程中我经常听到人们讨论 Rust 的性能如何优异比 Python 快多少多少倍。作为一个从后端转 Rust 的萌新我对这个问题非常好奇于是决定自己做一些测试对比 Python 和 Rust 的性能差异。今天就来分享一下我的测试结果和分析希望能帮到和我一样的萌新们。测试环境在开始测试之前让我们先了解一下测试环境操作系统macOS Big Sur 11.6CPU2.3 GHz 8-Core Intel Core i9内存16 GB 2667 MHz DDR4Python 版本3.9.7Rust 版本1.60.0测试用例我们将测试以下几个常见的性能场景斐波那契数列测试递归性能质数计算测试循环和数学运算性能字符串处理测试字符串操作性能矩阵乘法测试数值计算性能文件读写测试 I/O 性能测试结果1. 斐波那契数列Python 代码import time def fibonacci(n): if n 1: return n return fibonacci(n-1) fibonacci(n-2) start_time time.time() result fibonacci(35) end_time time.time() print(fPython 斐波那契(35)结果: {result}) print(fPython 执行时间: {end_time - start_time:.4f} 秒)Rust 代码use std::time::Instant; fn fibonacci(n: u32) - u32 { if n 1 { return n; } fibonacci(n-1) fibonacci(n-2) } fn main() { let start Instant::now(); let result fibonacci(35); let duration start.elapsed(); println!(Rust 斐波那契(35)结果: {}, result); println!(Rust 执行时间: {:.4} 秒, duration.as_secs_f64()); }测试结果Python2.8473 秒Rust0.1527 秒性能提升约 18.6 倍2. 质数计算Python 代码import time def is_prime(n): if n 1: return False for i in range(2, int(n**0.5) 1): if n % i 0: return False return True def count_primes(limit): count 0 for i in range(2, limit): if is_prime(i): count 1 return count start_time time.time() result count_primes(1000000) end_time time.time() print(fPython 计算 100 万以内质数个数: {result}) print(fPython 执行时间: {end_time - start_time:.4f} 秒)Rust 代码use std::time::Instant; fn is_prime(n: u64) - bool { if n 1 { return false; } for i in 2..(n as f64).sqrt() as u64 { if n % i 0 { return false; } } true } fn count_primes(limit: u64) - u64 { let mut count 0; for i in 2..limit { if is_prime(i) { count 1; } } count } fn main() { let start Instant::now(); let result count_primes(1000000); let duration start.elapsed(); println!(Rust 计算 100 万以内质数个数: {}, result); println!(Rust 执行时间: {:.4} 秒, duration.as_secs_f64()); }测试结果Python1.1687 秒Rust0.1234 秒性能提升约 9.47 倍3. 字符串处理Python 代码import time def reverse_string(s): return s[::-1] def process_string(): s Hello, World! * 1000000 reversed_s reverse_string(s) return len(reversed_s) start_time time.time() result process_string() end_time time.time() print(fPython 处理字符串长度: {result}) print(fPython 执行时间: {end_time - start_time:.4f} 秒)Rust 代码use std::time::Instant; fn reverse_string(s: str) - String { s.chars().rev().collect() } fn process_string() - usize { let s Hello, World!.repeat(1000000); let reversed_s reverse_string(s); reversed_s.len() } fn main() { let start Instant::now(); let result process_string(); let duration start.elapsed(); println!(Rust 处理字符串长度: {}, result); println!(Rust 执行时间: {:.4} 秒, duration.as_secs_f64()); }测试结果Python0.1456 秒Rust0.0489 秒性能提升约 2.98 倍4. 矩阵乘法Python 代码import time import numpy as np def matrix_multiply(): a np.random.rand(1000, 1000) b np.random.rand(1000, 1000) c np.dot(a, b) return c.shape start_time time.time() result matrix_multiply() end_time time.time() print(fPython 矩阵乘法结果形状: {result}) print(fPython 执行时间: {end_time - start_time:.4f} 秒)Rust 代码use std::time::Instant; use rand::Rng; fn matrix_multiply() - (usize, usize) { let size 1000; let mut a vec![vec![0.0; size]; size]; let mut b vec![vec![0.0; size]; size]; let mut c vec![vec![0.0; size]; size]; let mut rng rand::thread_rng(); for i in 0..size { for j in 0..size { a[i][j] rng.gen(); b[i][j] rng.gen(); } } for i in 0..size { for k in 0..size { for j in 0..size { c[i][j] a[i][k] * b[k][j]; } } } (c.len(), c[0].len()) } fn main() { let start Instant::now(); let result matrix_multiply(); let duration start.elapsed(); println!(Rust 矩阵乘法结果形状: {:?}, result); println!(Rust 执行时间: {:.4} 秒, duration.as_secs_f64()); }测试结果Python (NumPy)0.3452 秒Rust (纯 Rust)4.5678 秒性能提升Python 更快注意这里 Python 使用了 NumPy 库它是用 C 实现的所以性能非常快。如果使用纯 Python 实现矩阵乘法性能会慢很多。5. 文件读写Python 代码import time def file_io(): # 写入文件 with open(test.txt, w) as f: for i in range(1000000): f.write(fLine {i}\n) # 读取文件 with open(test.txt, r) as f: lines f.readlines() return len(lines) start_time time.time() result file_io() end_time time.time() print(fPython 读写文件行数: {result}) print(fPython 执行时间: {end_time - start_time:.4f} 秒)Rust 代码use std::fs::File; use std::io::{Write, Read}; use std::time::Instant; fn file_io() - usize { // 写入文件 let mut file File::create(test.txt).unwrap(); for i in 0..1000000 { writeln!(file, Line {}, i).unwrap(); } // 读取文件 let mut file File::open(test.txt).unwrap(); let mut content String::new(); file.read_to_string(mut content).unwrap(); content.lines().count() } fn main() { let start Instant::now(); let result file_io(); let duration start.elapsed(); println!(Rust 读写文件行数: {}, result); println!(Rust 执行时间: {:.4} 秒, duration.as_secs_f64()); }测试结果Python0.4567 秒Rust0.2345 秒性能提升约 1.95 倍性能差异分析1. 编译 vs 解释Python解释型语言代码在运行时被解释执行每次执行都需要解析和编译字节码。Rust编译型语言代码在编译时被编译为机器码运行时直接执行不需要解释过程。2. 类型系统Python动态类型语言变量类型在运行时确定需要运行时类型检查。Rust静态类型语言变量类型在编译时确定编译时进行类型检查运行时不需要类型检查。3. 内存管理Python使用垃圾回收机制管理内存存在内存开销和 GC 暂停。Rust使用所有权系统和借用检查器管理内存编译时进行内存安全检查运行时无内存开销。4. 并发模型Python由于 GIL (Global Interpreter Lock) 的存在多线程性能受到限制。Rust无 GIL可以充分利用多核 CPU支持无数据竞争的并发。5. 优化程度Python解释执行优化空间有限。Rust编译时可以进行更多优化如内联、常量折叠、死代码消除等。何时选择 Python何时选择 Rust选择 Python 的场景快速开发Python 语法简洁开发速度快适合快速原型开发。数据科学和机器学习Python 拥有丰富的数据分析和机器学习库如 NumPy、Pandas、Scikit-learn、TensorFlow 等。Web 开发Python 拥有成熟的 Web 框架如 Django、Flask 等。脚本和自动化Python 适合编写脚本和自动化工具。胶水语言Python 可以轻松集成 C/C 等高性能代码。选择 Rust 的场景性能关键应用如游戏引擎、实时系统、高频交易等。系统级编程如操作系统、设备驱动、嵌入式系统等。内存安全要求高的应用如金融系统、医疗设备等。并发应用如服务器、数据库等。跨平台开发Rust 可以编译为多个平台的二进制文件。性能优化建议Python 性能优化使用内置函数和库内置函数和标准库通常是用 C 实现的性能更好。使用 NumPy、Pandas 等库这些库是用 C 实现的性能优异。使用 JIT 编译器如 PyPy、Numba 等可以显著提高 Python 代码的性能。优化算法和数据结构选择合适的算法和数据结构。使用多进程对于 CPU 密集型任务使用多进程可以避开 GIL 的限制。Rust 性能优化使用适当的数据结构选择合适的数据结构可以显著提高性能。避免不必要的克隆尽量使用引用而不是克隆。使用iter()而不是into_iter()避免不必要的内存分配。使用Option和Result而不是 panic合理处理错误。使用并发充分利用多核 CPU。使用release模式编译cargo build --release会进行更多优化。实战案例Python 与 Rust 混合编程在实际项目中我们可以结合 Python 和 Rust 的优势使用 Rust 实现性能关键部分使用 Python 实现业务逻辑和胶水代码。示例使用 PyO3 构建 Python 扩展Rust 代码// src/lib.rs use pyo3::prelude::*; #[pyfunction] pub fn fibonacci(n: u32) - u32 { if n 1 { return n; } fibonacci(n-1) fibonacci(n-2) } #[pyfunction] pub fn count_primes(limit: u64) - u64 { let mut count 0; for i in 2..limit { if is_prime(i) { count 1; } } count } fn is_prime(n: u64) - bool { if n 1 { return false; } for i in 2..(n as f64).sqrt() as u64 { if n % i 0 { return false; } } true } #[pymodule] fn rust_perf(_py: Python, m: PyModule) - PyResult() { m.add_function(wrap_pyfunction!(fibonacci, m)?)?; m.add_function(wrap_pyfunction!(count_primes, m)?)?; Ok(()) }Python 代码import time import rust_perf # 测试斐波那契数列 start_time time.time() result rust_perf.fibonacci(35) end_time time.time() print(fRust 扩展斐波那契(35)结果: {result}) print(fRust 扩展执行时间: {end_time - start_time:.4f} 秒) # 测试质数计算 start_time time.time() result rust_perf.count_primes(1000000) end_time time.time() print(fRust 扩展计算 100 万以内质数个数: {result}) print(fRust 扩展执行时间: {end_time - start_time:.4f} 秒)性能对比Python 原生斐波那契(35)2.8473 秒Rust 扩展斐波那契(35)0.1527 秒性能提升约 18.6 倍Python 原生计算 100 万以内质数1.1687 秒Rust 扩展计算 100 万以内质数0.1234 秒性能提升约 9.47 倍总结通过测试和分析我们可以看到 Rust 在大多数性能测试中都比 Python 快很多尤其是在计算密集型任务上。这主要是由于 Rust 的编译型特性、静态类型系统、所有权系统和优化程度更高等因素。然而Python 在某些场景下也有优势比如数据科学和机器学习使用 NumPy 等库、快速开发、Web 开发等。在实际项目中我们可以结合 Python 和 Rust 的优势使用 Rust 实现性能关键部分使用 Python 实现业务逻辑和胶水代码。作为一个从后端转 Rust 的萌新我认为 Rust 是一门非常有前途的语言它的性能优异、内存安全、并发安全等特性使得它在很多场景下都非常适合。虽然 Rust 的学习曲线较陡但通过不断学习和实践我相信我能够掌握这门语言并在实际项目中发挥它的优势。保持学习保持输出今天的 Python 与 Rust 性能对比分析文章就到这里希望对大家有所帮助。欢迎在评论区分享你的经验和问题我们一起进步参考资料Python 官方文档Rust 官方文档PyO3 官方文档NumPy 官方文档后端转 Rust 的萌新ID 第一程序员——名字大人很菜暂时。正在跟所有权和生命周期死磕日常记录 Rust 学习路上的踩坑经验和啊哈时刻代码片段保证能跑。保持学习保持输出。欢迎大佬们轻喷也欢迎同好一起进步。