专栏名称: 高可用架构
高可用架构公众号。
目录
相关文章推荐
美团技术团队  ·  可信实验白皮书系列04:随机轮转实验 ·  3 天前  
美团技术团队  ·  可信实验白皮书系列03:随机对照实验 ·  3 天前  
架构师之路  ·  爸爸!除了你,沈括,沈万三... ... ·  4 天前  
51好读  ›  专栏  ›  高可用架构

从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

高可用架构  · 公众号  · 架构  · 2016-10-25 09:11

正文

请到「今天看啥」查看全文



优化结果


部署该库后,专门用于 source map 处理的机器压力大大降低。



最糟糕的 source map 处理时间减少到原来的十分之一。



更重要的是,平均处理时间减少到〜 400 ms。




JavaScript 是我们最受欢迎的项目语言,这种变化达到了将所有事件的端到端处理时间减少到〜 300 ms。



在 Python 中 嵌入 Rust


有很多方法可以暴露 Rust 库给 Python。我们选择将 Rust 代码编译成一个 dylib,并提供一些 ol'C 函数,通过 CFFI 和 C 头文件暴露给 Python。有了 C 语言头文件,CFFI 生成一些 shim( shim 是一个小型的函数库,用于透明地拦截 API 调用,修改传递的参数、自身处理操作、或把操作重定向到其他地方),可以调用 Rust。这样,libsourcemap 可以打开在运行时从 Rust 生成的动态共享库。


这个过程有两个步骤。第一个是在 setup.py 运行时配置 CFFI 的构建模块:



在构建模块之后,头文件通过 C 预处理器来处理,以便扩展宏( CFFI 本身无法执行的过程)。此外,这将告诉 CFFI 在哪里放置生成的 shim 模块。所有完成的之后,加载模块:



下一步是编写一些包装器代码来为 Rust 对象提供一个 Python API,这样能够转发异常。这发生在两个过程中:首先,确保在 Rust 代码中,我们尽可能使用结果对象。此外,我们需要处理好 panic,以确保他们不会跨越 DLL 边界。第二,我们定义了一个可以存储错误信息的帮助结构 ; 并将其作为 out 参数传递给可能失败的函数。


在 Python 中,我们提供了一个上下文管理器:



我们有一个特定错误类( special_errors)的字典,但如果没有找到具体的错误,将会抛一个通用的 SourceMapError。


从那里,我们实际上可以定义 source map 的基类:



在 Rust 中暴露 C ABI







请到「今天看啥」查看全文