2 个不稳定版本
0.6.0 | 2024 年 3 月 27 日 |
---|---|
0.5.0 | 2024 年 2 月 7 日 |
#7 in #beancount
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 拥有的数据结构的指针。因此,性能目标是尽量减少这种分配的数量。
采用了多种机制来减少分配。
-
字符串被内部化,具有相同值的字符串映射到单个 Python 字符串对象。
-
包含账户名称的列表也被重复使用。
示例
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