1个不稳定版本
0.1.0 | 2024年4月15日 |
---|
#125 在 生物学
17KB
158 行
prot_translate
将核苷酸序列(dna或rna)翻译成蛋白质。
用法
将其添加到您的 Cargo.toml
[dependencies]
prot_translate = "0.1.0"
示例
use prot_translate::*;
fn main() {
let dna = b"GTGAGTCGTTGAGTCTGATTGCGTATC";
let protein = translate(dna);
assert_eq!("VSR*V*LRI", &protein);
let dna = b"GCTAGTCGTATCGTAGCTAGTC";
let peptide = translate3(dna,None);
assert_eq!(&peptide, "AlaSerArgIleValAlaSer");
// To shift reading frame
let protein_frame2 = translate(&dna[1..]);
assert_eq!("*VVESDCV", &protein_frame2);
let dna = b"GCTAGTCGTATCGTAGCTAGTC";
let peptide = translate_full(dna,None);
assert_eq!(&peptide, "AlanineSerineArginineIsoleucineValineAlanineSerine");
}
基准测试
当前的算法灵感来源于 seqan的实现,它使用数组索引。以下是与其他方法的性能比较(在2012年macbook pro上测试)。
方法 | 10 bp* | 100 bp | 1,000 bp | 10,000 bp | 100,000 bp | 1百万 bp |
---|---|---|---|---|---|---|
prot_translate | 91 ns | 0.29 μs | 2.28 μs | 23 μs | 215 μs | 2.25 ms |
fnv hashmap | 111 ns | 0.37 μs | 3.58 μs | 37 μs | 366 us | 3.86 ms |
std hashmap | 160 ns | 1.03 μs | 9.65 μs | 100 μs | 943 μs | 9.40 ms |
phf_map | 177 ns | 1.04 μs | 9.47 μs | 100 μs | 936 μs | 9.91 |
match语句 | 259 ns | 1.77 μs | 17.9 μs | 163 μs | 1941 μs | 19.1 ms |
prot_translate (unchecked) | 90 ns | 0.26 μs | 2.02 μs | 20 μs | 197 μs | 1.92 ms |
*bp = "base pairs"
要自己进行基准测试(由于phf_map宏,必须使用nightly版本)。
cargo +nightly bench
想法
- FNV 看起来是一个很好的选择,但我选择使用当前的实现,因为它稍微快一些,且不需要任何依赖。
- 最初有一个名为
translate_unchecked
的函数,它没有验证每个字节是否为有效的ASCII,但由于性能提升微不足道,因此已删除。
待办事项
- 添加其他密码子表(例如,脊椎动物线粒体,酵母线粒体,霉菌线粒体等)
- 添加对模糊核苷酸的支持(目前只支持A,U,T,C,G)
测试
要测试
cargo test
还可以生成新的测试数据(需要python3和 biopython)。
# Generate 500 random sequences and their peptides
python3 tests/generate_test_data.py 500