gpt4 book ai didi

performance - Rust 在解析文件时比 Python 慢

转载 作者:行者123 更新时间:2023-11-29 07:52:25 25 4
gpt4 key购买 nike

我希望使用 Rust 来加速一些目前用 Python 编写的文本处理脚本。

为了测试这两种语言的性能,我决定在一个非常简单的任务上测试它们:

  • STDIN 中读取一个文件, 逐行。
  • 如果该行以> 开头, 将行保存到 headers.txt文件。
  • 否则,将行保存到 sequences.txt文件。

对于这个测试,我使用了一个 1000 万行的 fasta 文件,它看起来如下:

$ head uniparc_active-head.fasta
>UPI0000000001 status=active
MGAAASIQTTVNTLSERISSKLEQEANASAQTKCDIEIGNFYIRQNHGCNLTVKNMCSAD
ADAQLDAVLSAATETYSGLTPEQKAYVPAMFTAALNIQTSVNTVVRDFENYVKQTCNSSA
VVDNKLKIQNVIIDECYGAPGSPTNLEFINTGSSKGNCAIKALMQLTTKATTQIAPKQVA
GTGVQFYMIVIGVIILAALFMYYAKRMLFTSTNDKIKLILANKENVHWTTYMDTFFRTSP
MVIATTDMQN
>UPI0000000002 status=active
MMTPENDEEQTSVFSATVYGDKIQGKNKRKRVIGLCIRISMVISLLSMITMSAFLIVRLN
QCMSANEAAITDAAVAVAAASSTHRKVASSTTQYDHKESCNGLYYQGSCYILHSDYQLFS
DAKANCTAESSTLPNKSDVLITWLIDYVEDTWGSDGNPITKTTSDYQDSDVSQEVRKYFC

这是我的 Python 脚本:

import fileinput

with open('headers.txt', 'w') as hof, \
open('sequences.txt', 'w') as sof:
for line in fileinput.input():
if line[0] == '>':
hof.write(line)
else:
sof.write(line)

和我的 Rust 脚本(我在 cargo build --release 中编译):

use std::io;
use std::fs::File;
use std::io::Write;
use std::io::BufRead;

fn main() {
let stdin = io::stdin();
let mut headers = File::create("headers.txt").unwrap();
let mut sequences = File::create("sequences.txt").unwrap();

for line in stdin.lock().lines() {
let line = line.unwrap();
match &line[..1] {
">" => writeln!(headers, "{}", line).unwrap(),
_ => writeln!(sequences, "{}", line).unwrap(),
}
}
}

运行一些基准测试:

python 2.7

$ time bash -c 'cat uniparc_active-head.fasta | python2 src/main.py'
real 0m11.704s
user 0m6.996s
sys 0m1.100s

python 3.5

$ time bash -c 'cat uniparc_active-head.fasta | python3 src/main.py'
real 0m16.788s
user 0m12.508s
sys 0m1.576s

PyPy 5.3.1

$ time bash -c 'cat uniparc_active-head.fasta | pypy src/main.py'
real 0m6.526s
user 0m1.536s
sys 0m0.884s

使用rust 1.14.0

$ cargo build --release
$ time bash -c 'cat uniparc_active-head.fasta | target/release/parse_text'
real 0m17.493s
user 0m2.728s
sys 0m15.408s

因此 Rust 比 PyPy 慢约 3 倍,甚至比 Python 3 慢。

任何人都可以阐明这一点吗?我在 Rust 代码中犯了错误吗?如果不是,我应该坚持使用 Python/PyPy 来处理文本文件,还是有其他语言更适合这项工作?

最佳答案

按照@BurntSushi5 的建议,替换

let mut headers = File::create("headers.txt").unwrap();
let mut sequences = File::create("sequences.txt").unwrap();

let mut headers = io::BufWriter::new(File::create("headers.txt").unwrap());
let mut sequences = io::BufWriter::new(File::create("sequences.txt").unwrap());

使速度达到我的预期:

$ time bash -c 'cat uniparc_active-head.fasta | target/release/parse_text'
real 0m5.645s
user 0m1.396s
sys 0m0.804s

关于performance - Rust 在解析文件时比 Python 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41390244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com