大家好,我是 Python 库 convtools 的作者。它允许动态定义数据转换,然后将其编译成专门的 Python 代码。
这是我使用这个工具的第一个案例。
比方说,您想按 “a ”对字典进行分组,取 “b ”的总和。
你可以自己写代码,但如果代码可以由库生成,为什么还要自己写呢?尤其是 convtools 会尽力写出更快的代码。
下面是两个例子:使用 convtools 和不使用 convtools。
可以说:更简洁。
客观地说:对 50 多个字典来说更快。
"""
convtools showcase 1:
Group dictionaries by "a", taking sums of "b".
"""
data = [
{"a": 1, "b": 1},
{"a": 2, "b": 2},
{"a": 1, "b": 3},
{"a": 2, "b": 4},
{"a": 1, "b": 5},
] * 10
# VANILLA PYTHON
def f_vanilla(data):
agg_data = {}
for item in data:
if item["a"] in agg_data:
agg_data[item["a"]]["b"] += item["b"]
else:
agg_data[item["a"]] = {"a": item["a"], "b": item["b"]}
return list(agg_data.values())
result = f_vanilla(data)
"""
In [22]: result
Out[22]: [{'a': 1, 'b': 90}, {'a': 2, 'b': 60}]
Python 3.12.1 (main, Jan 3 2024, 13:01:25) [Clang 15.0.0 (clang-1500.1.0.2.5)]
In [17]: %timeit f_vanilla(data)
4.3 µs ± 18.1 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
"""
from convtools import conversion as c
f_convtools = (
c.group_by(c.item("a"))
.aggregate(
{
"a": c.item("a"),
"b": c.ReduceFuncs.Sum(c.item("b")),
}
)
.gen_converter()
)
result2 = f_convtools(data)
assert result == result2
"""
Python 3.12.1 (main, Jan 3 2024, 13:01:25) [Clang 15.0.0 (clang-1500.1.0.2.5)]
In [18]: %timeit f_convtools(data)
3.69 µs ± 5.78 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
"""
以下是文档 https://convtools.readthedocs.io
目前只有英文版。
如果有任何反馈,我们将不胜感激。包括我正在使用的英译中翻译器是否做得很好,这个库是否有用,以及任何问题和想法。