rust学习体会:换成rust会提高代码执行速度吗?

最近在写一个bam的过滤代码,觉得速度有点慢,于是打算用rust写。然而由于水平太差,就让GPT-4帮我改写,结果GPT-4也对Rust的rust-htslib库不熟悉,就各种出错,更让人难受的是,把错误给了GPT-4,它也就只会认错,然后给了你另一段不一定成功的代码。(再次深刻的理解到,现阶段的大语言模型,只能作为助手,真正下决策的还得是专业人士)。

首先,用samtools来提供一个基准速度,测试的文件是4G,用时大概是168秒,平均写出速度是23.8mb/s。

$ time samtools view -b input.bam -o out.bam
159.91s user 3.84s system 96% cpu 2:48.91 total

接下来,让GPT-4写一段类似功能的Rust代码,由于逻辑一点都不复杂,因此这个任务还是能做好的

use rust_htslib::{bam, bam::Read};

fn copy_bam(input_path: &str, output_path: &str) -> Result<(), Box<dyn std::error::Error>> {
    let mut input = bam::Reader::from_path(input_path)?;
    let header = bam::Header::from_template(input.header());
    // 注意这里的更正:`bam::Format::Bam`
    let mut output = bam::Writer::from_path(output_path, &header, bam::Format::Bam)?;

    for result in input.records() {
        let record = result?;
        output.write(&record)?;
    }

    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    copy_bam("input.bam", "out.bam")?;
    Ok(())
}

用时大约202秒,平均写出速度是19.1 mb/s

$ time bamrw/target/release/bamrw 
bamrw/target/release/bamrw  202.93s user 4.10s system 98% cpu 3:29.28 total

然后是用pysam进行读写

import pysam

def copy_bam(input_path: str, output_path: str):
    # 打开输入的 BAM 文件
    with pysam.AlignmentFile(input_path, "rb") as input_file:
        # 创建输出的 BAM 文件
        with pysam.AlignmentFile(output_path, "wb", template=input_file) as output_file:
            for read in input_file:
                # 将每个 read 写入输出文件
                output_file.write(read)

if __name__ == "__main__":
    copy_bam("input.bam", "out.bam")

用时大概423秒,读写速度是9.5mb/s

$ time bamrw.py 
python bamrw.py  418.31s user 3.68s system 99% cpu 7:03.98 total

因此在读写上面,rust确实比python快了两倍,不过依旧比C慢一点点。

不过需要明确的是,我之前的代码速度慢,是因为其中一步是计算时间比较久,导致大部分时间都是在等待计算完成,而不是IO瓶颈。当我通过多进程并行后,速度有了明显的提升。我并不确定,用Rust改写那个函数,在单线程的情况下,是否会提高效率,等我学一段时间的Rust,再试试看吧。

# 随笔 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×