tzfpy Rust 重写🎉

Posted on Nov 24, 2022

书接上文:

经过一个周末的各种折腾,终于用 Rust 实现了 tzf 的功能,代码在 ringsaturn/tzf-rs。

又用了晚上跑了多次 CI 将 Python 移植也重写出来了 ringsaturn/tzfpy。

tzfpy 只要安装 >= 0.11.0 版本的就是用纯 Rust 实现的,在这个版本号之前都是 Python+CGO 实现的。 API 参数和之前一样,没有变化,但是索引命中的时候只需要 3~4 微妙,之前 Python+Go 需要 16 微妙。 最慢的单次查询 300 多微妙,timezonefinder(用 C 实现的多边形算法版本) 最慢的时候会有 1000 多微妙。


Rust 上手的曲线确实高,记得第一次想用 Rust 是因为 orjson 当时的 NumPy 只是比较有限, 想进去魔改支持下 NumPy 没想到没折腾出来。后来各种机会也尝试过 Rust 总是学一点就停了。

上个周末不知为何鼓足了勇气连轴转写了两天整出来了,也算是慢慢入门了吧。

发现 Rust 开源项目的丰富度、成熟度和 Go/Python 比还不够, 比如地理计算这块,Go 里最慢的实现 10 万纳秒之内也能完成处理。 而 geoRust/geo 处理时区多边形遍历搜索需要 170 万纳秒。 还是将 Go 里用的 tidwall/geometry 手动移植过来才实现, 花了半天时间 ringsaturn/geometry-rs

后面会在公司的博客/公众号里连载这一年所做的各种地理计算上的性能优化,这块也是其中一节。