python是解釋型語言,速度是比較慢的。前面有期對比了python和go同時執(zhí)行500萬的質(zhì)數(shù)計算,結(jié)果:
語言
| 求解個數(shù)
| 結(jié)果個數(shù)
| 時長(s)
| python
| 500萬
| 348513
| 52.75
| go
| 500萬 | 348513 | 16.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.02 | 0.57 | 500萬
| 50.29
| 18.05 |
以下的實現(xiàn)過程:
安裝c++庫,再安裝rust,略
安裝maturin pip install maturin 新建項目maturin new rust_mod,里面已經(jīng)有1個sum_as_string函數(shù)例子 參考例子,寫求質(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(()) }
編譯 ,生成whl包 maturin build --interpreter python 注意,發(fā)布時要用: maturin build --release --interpreter python 安裝包 pip install ***.whl 寫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.05 t1=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;
|