#python-bindings #beancount #parser #string #performance #interface #zero-copy

beancount-parser-lima-python

beancount-parser-lima 的 Python 绑定

2 个不稳定版本

0.6.0 2024 年 3 月 27 日
0.5.0 2024 年 2 月 7 日

#7 in #beancount

MIT/Apache

310KB
8K SLoC

beancount-parser-lima 的 Python 绑定

Python 绑定简化了 Rust 接口,主要因为无法实现零拷贝,所有指令都通过值返回。

Python 绑定仍在开发中

安装和使用

PyPI 上有可用的二进制轮,因此不需要本地的 Rust 开发环境。

$ python -m venv ~/virtualenvs/beancount-python-lima
$ source ~/virtualenvs/beancount-python-lima/bin/activate
(beancount-python-lima) $ pip install beancount-parser-lima

(beancount-python-lima) $ python python-examples/parse.py ../beancount-parser-lima/examples/data/full.beancount

性能

与 Rust 相比,Python 的主要缺点是无法实现零拷贝。返回给 Python 的每个值都必须是在堆上分配的 Python 对象。无法返回 Rust 拥有的数据结构的指针。因此,性能目标是尽量减少这种分配的数量。

采用了多种机制来减少分配。

  1. 字符串被内部化,具有相同值的字符串映射到单个 Python 字符串对象。

  2. 包含账户名称的列表也被重复使用。

示例

2023-05-01 * "EMERSON S TAPROOM"
  Assets:Bank:Current                           -25.00 NZD
  Expenses:Entertainment:Drinks-and-snacks

2023-05-02 * "EMERSON S TAPROOM"
  Assets:Bank:Current                           -12.50 NZD
  Expenses:Entertainment:Drinks-and-snacks

2023-05-03 * "BANK TRANSFER"
  Assets:Bank:Current                           100.00 NZD
  Assets:Bank:Savings

只分配了一个 Python 字符串来存储货币 "NZD"。它将有四个引用计数(每个返回值一个,加上字符串表中的主值一个)。

同样,只使用一个 Python 字符串来存储四个实例的 "Assets"(引用计数为五个),以及一个 Python 字符串存储值 "Bank"(也具有五个引用计数)。

分配了一个包含内容的单个列表 ["Assets", "Bank", "Current"],其引用计数为四个(三个返回值加上账户表中的主副本)。另一个列表包含相同内容的 ["Assets", "Bank", "Savings"],使用与另一个列表相同的 Python 字符串对象作为列表前两个值的对象。

开发外壳

如果您已安装Rust工具链和其他必需的工具(例如 maturin,有关这些工具的更多信息请参阅 flake.nix),则可以本地构建和运行解析器,如下所示。

$ cd beancount-parser-lima-python
$ python -m venv .venv
$ maturin develop
$ source .venv/bin/activate
$ python-examples/parse.py ../beancount-parser-lima/examples/data/full.beancount

开放问题和未来工作

跨越

能够返回跨越值以进行应用程序错误报告将是非常有用的。

依赖项

约15–21MB
约278K SLoC