簡體   English   中英

為什么 cython embedded plugins 在 cpython 解釋器中比 rust-c 接口版本有更高的性能?

[英]Why cython embeded plugins has higher performance in cpython interpreter than rust-c interface versions?

想請教一些關於python解釋器底層原理的問題,因為自己搜索的時候沒有得到太多有用的信息。

我最近一直在使用 rust 編寫 python 插件,這大大加快了 python 的 cpu 密集型任務,並且與 c 相比,它的編寫速度也更快。但是它有一個缺點是,與使用 cython 的舊方案相比為了加速,rust(我使用的是pyo3)的調用開銷似乎大於c(我使用的是cython),

例如,我們在這里得到一個空的 python function:

def empty_function():
    return 0

通過 for 循環在 Python 中調用它一百萬次並計算時間,這樣我們就可以發現每次調用大約需要 70 納秒(在我的電腦中)。

如果我們將它編譯成一個 cython 插件,使用相同的源代碼:

# test.pyx
cpdef unsigned int empty_function():
    return 0

執行時間將減少到 40 納秒。 這意味着我們可以使用 cython 進行一些細粒度的嵌入,我們可以期望它總是比原生 python 執行得更快。

然而,當涉及到 Rust 時,(老實說,我現在更喜歡使用 rust 進行插件開發而不是 cython,因為不需要在語法上做一些奇怪的黑客攻擊),調用時間將增加到 140 納秒,幾乎是本機python,源碼如下:

use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn empty_function() -> usize {
    0
}

#[pymodule]
fn testlib(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(empty_function, m)?)?;
    Ok(())
}

這意味着rust不適合python的細粒度嵌入式替換。如果有一個任務調用時間很少,每次調用時間很長,那么使用rust是完美的。但是如果有一個任務會代碼中調用了很多,那么rust好像不太合適,因為類型轉換的開銷會占用大部分加速時間。

我想知道這是否可以解決,更重要的是,我想知道這種差異的根本原因。 在它們之間調用時,cpython 解釋器是否存在某種差異,例如調用 c 插件時 cpython 和 pypy 之間的差異? 我在哪里可以獲得更多信息? 謝謝。

===

更新:

sorry各位,沒想到我的問題會這么模棱兩可,畢竟三者的源碼都給了,用timeit測試function運行時幾乎是python開發的約定俗成。

我的測試代碼幾乎與@Jmb 在評論中的代碼完全相同,有一些細微的差別,我使用python setup.py build_ext --inplace方式來構建而不是裸露的 gcc,但這應該沒有任何區別。 總之謝謝補充。

這里還值得注意的是,使用python setup.py build_ext --inplace編譯 rust 擴展時會以未優化模式構建它們(同樣適用於python setup.py developpip install -e. )。

以下是 output 的摘錄:

Finished dev [unoptimized + debuginfo] target(s) in 0.02s

要使用優化的二進制文件以“發布”模式構建,請使用:

pip install .

使用pip install. --verbose pip install. --verbose你可以看到區別:

Finished release [optimized] target(s) in 1.02s

這可以產生巨大的差異,在我的例子中,未優化的構建比優化的構建慢 9 倍。

正如評論中所建議的,這是一個自我回答。

由於評論部分的討論沒有得出明確的結論,所以我去 pyo3 的 repo 中提出了一個問題,並得到了其主要維護者的回應。

總之,結論是pyo3和cython編譯的插件在cpython調用時沒有本質區別。 當前的速度差異來自於優化深度的不同。

這是問題的鏈接: https://github.com/PyO3/pyo3/issues/1470

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM