【问题标题】:Python faster than rust with py03Python 使用 py03 比 rust 更快
【发布时间】:2022-11-12 17:18:32
【问题描述】:

我正在尝试使用 py03 的 rust 绑定来加速一些 python 代码。

我在 python 和 rust 中实现了以下功能:

def _play_action(state, action):

    temp = state.copy()
    i1, j1, i2, j2 = action
    h1 = abs(temp[i1][j1])
    h2 = abs(temp[i2][j2])
    if temp[i1][j1] < 0:
        temp[i2][j2] = -(h1 + h2)
    else:
        temp[i2][j2] = h1 + h2
    temp[i1][j1] = 0
    return temp

#[pyfunction]
fn play_action(state: [[i32; 9]; 9], action : [usize;4]) -> [[i32; 9]; 9] {
    let mut s = state.clone();

    let h1 = s[action[0]][action[1]];
    let h2 = s[action[2]][action[3]];

    s[action[0]][action[1]] = 0;
    s[action[2]][action[3]] = h1.signum() * (h1 + h2).abs();

    s

令我惊讶的是,python 版本更快……知道为什么吗?

【问题讨论】:

  • 您是否使用 --release 进行编译,是否可以通过使用 mut state 参数来避免 let mut s = state.clone();
  • 这段代码做的并不多,这会花费时间。与函数实际执行的操作相比,从 python 调用 rust 函数的开销可能太高。

标签: python performance rust


【解决方案1】:

这可能是由于 python 和 Rust 之间的通信开销造成的,您传递的数据太小所以我假设您多次调用play_action。更好的方法是批量调用

#[pyfunction]
fn play_actions(data: Vec<([[i32; 9]; 9],[usize;4])>) -> Vec<[[i32; 9]; 9]> {
   data.into_iter()
      .map(|(state,action)| play_action(state,action))
      .collect::<Vec<_>>()
}

fn play_action(state: [[i32; 9]; 9], action : [usize;4]) -> [[i32; 9]; 9] {
    let mut s = state.clone();

    let h1 = s[action[0]][action[1]];
    let h2 = s[action[2]][action[3]];

    s[action[0]][action[1]] = 0;
    s[action[2]][action[3]] = h1.signum() * (h1 + h2).abs();

    s
}

【讨论】:

    【解决方案2】:

    如果您从 Python 调用用 rust 编写的函数,则必须进行从 Python 对象到 rust 数据结构的转换。这花费的时间是开销。

    由于您的函数看起来很小,因此开销很容易超过函数的运行时间。

    我会鼓励你轮廓你的 python 代码,然后再尝试让它更快。它提供的分析和对代码行为的洞察力可以显着提高性能。

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 2023-01-16
      • 2022-07-29
      • 2016-05-28
      • 2022-11-20
      • 1970-01-01
      • 2010-10-22
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多