午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

給python換上rust核動力

 F2967527 2022-12-08 發(fā)布于北京

python是解釋型語言,速度是比較慢的。前面有期對比了python和go同時執(zhí)行500萬的質(zhì)數(shù)計算,結(jié)果:

語言
求解個數(shù)
結(jié)果個數(shù)
時長(s)
python
500萬
348513
52.75
go
500萬34851316.35

但python和go的交互還不是太方便,需要編譯成so文件,再用ctypes調(diào)用。

而rust的性能媲美c和c++,更妙的是可以直接編譯成python的whl包import。

同樣的求解質(zhì)數(shù),先看測試結(jié)果:

數(shù)據(jù)量
python
rust
5萬
0.13
0.19
50萬
2.020.57
500萬
50.29
18.05

以下的實現(xiàn)過程:

  1.  安裝c++庫,再安裝rust,略

  2.  安裝maturin pip install maturin

  3.  新建項目maturin new rust_mod,里面已經(jīng)有1個sum_as_string函數(shù)例子

  4.  參考例子,寫求質(zhì)數(shù)的rust腳本

    use pyo3::prelude::*;use std::i32;
    /// Formats the sum of two numbers as string.#[pyfunction]fn sum_as_string(a: usize, b: usize) -> PyResult<String> { Ok((a + b).to_string())}pub fn is_div(n1:i32,n2:i32)->bool{ if n1%n2==0 { // println!('{}={}*{}',n1,n2,n1/n2); return true; } else{ return false; } }
    pub fn is_prime_number(num:i32)->bool{ let y1=num as f32; let y2=y1.sqrt() as i32+1; let mut is_prime=true; for x in 2..y2 { if is_div(num,x){ is_prime=false; } } return is_prime; }
    #[pyfunction]fn prime_count(num:i32)->i32 { let mut cnt:i32=0; for x in 2..num { if is_prime_number(x){ cnt+=1; } } cnt}
    /// A Python module implemented in Rust.#[pymodule]fn rust_mod(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; m.add_function(wrap_pyfunction!(prime_count, m)?)?; Ok(())}
  5.  編譯 ,生成whl包 maturin build --interpreter python 注意,發(fā)布時要用:

    maturin build --release --interpreter python

  6.  安裝包 pip install ***.whl

  7.  寫python腳本,導(dǎo)入rust_mod包

    import rust_mod import time# sum=rust_mod.sum_as_string(2,3)t0=time.time()sum=rust_mod.prime_count(50000)   #  5133 cost: 0.19# sum=rust_mod.prime_count(500000)  # 41538 cost: 0.57 41538,耗時:47.92# sum=rust_mod.prime_count(5000000) # 348513 cost: 18.05t1=time.time()print(sum,'cost:',round(t1-t0,2))

    運行python,記錄結(jié)果。

    研究rust,其實是想用rust來寫gp的存過,看性能提升情況。且已經(jīng)有相關(guān)框架,https:///mirrors/pgxr,但其例子太簡單了,而我的存過是temp表步步推進的,對于這種怎么用rust來寫尚不清楚,如有知道的朋友還請給我留言,先謝過。

    gp存過總體邏輯如下文所示:

    create temp table a as select ...;create temp table b as select ... from a join ...;--b要用到a表...insert into t select * from b;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多