Skip to content

Benefits of convtools

Fewer bugs & readability

  • it forces you to split the definition of data conversion from the data itself
  • functional approach (pipes, "everything is an expression") lifts the obligation to name variables at each step, lowering the chance of confusing them
  • convtools test coverage is 100% and it's development is test-driven, so whenever a bug is found, we'll do our best to make sure it never occurs again.

DRY

In some cases, to keep the code DRY (complying with "Don't Repeat Yourself" principle) or just readable you need to pay with code performance:

  • intensive code reuse (function call overhead)
  • configs known at compile time (loops, which can be unrolled)

convtools encapsulates non-dry pieces in the code it generates.

Of course, there's also a cost, but it is completely under your control where and when to run gen_converter to spend a fraction of a second to generate an ad-hoc converter.

Functionality

Since convtools is a code-generating layer, it provides you with an extra functionality like group_by, joins, pipes, etc.

Performance

'The Art of Computer Programming' book by Donald Knuth:

“The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.”

convtools worries about code efficiency, so you can put more effort into other parts of your code. The below table provides the speed-up of convtools-based solutions over the naive ones.

name speed_up py_compiler arch
Aggregate1 +28.4% Clang 15.0.0 (clang-1500.0.40.1) arm64
GroupBy1 - MANY_GROUPS +29.8% Clang 15.0.0 (clang-1500.0.40.1) arm64
DatetimeFormat2 +49.5% Clang 15.0.0 (clang-1500.0.40.1) arm64
GroupBy1 - FEW_GROUPS +70.4% Clang 15.0.0 (clang-1500.0.40.1) arm64
DatetimeFormat1 +75.1% Clang 15.0.0 (clang-1500.0.40.1) arm64
IterOfIter1 +90.7% Clang 15.0.0 (clang-1500.0.40.1) arm64
TableDictReader +122.8% Clang 15.0.0 (clang-1500.0.40.1) arm64
DateFormat2 +178.3% Clang 15.0.0 (clang-1500.0.40.1) arm64
DatetimeParse2 +205.4% Clang 15.0.0 (clang-1500.0.40.1) arm64
DatetimeParse1 +251.6% Clang 15.0.0 (clang-1500.0.40.1) arm64
DateParse1 +270.5% Clang 15.0.0 (clang-1500.0.40.1) arm64
DateParse2 +275.2% Clang 15.0.0 (clang-1500.0.40.1) arm64
DateFormat1 +563.8% Clang 15.0.0 (clang-1500.0.40.1) arm64
name speed_up py_compiler arch
Aggregate1 +30.4% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DatetimeFormat2 +33.5% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
GroupBy1 - MANY_GROUPS +35.3% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DatetimeFormat1 +55.5% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
GroupBy1 - FEW_GROUPS +57.9% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
IterOfIter1 +117.1% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DateFormat2 +139.8% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
TableDictReader +161.3% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DatetimeParse2 +210.6% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DatetimeParse1 +245.9% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DateParse1 +254.1% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DateParse2 +262.3% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
DateFormat1 +516.3% Clang 14.0.3 (clang-1403.0.22.14.1) arm64
name speed_up py_compiler arch
GroupBy1 - FEW_GROUPS -6.7% Clang 14.0.0 (clang-1400.0.29.201) arm64
GroupBy1 - MANY_GROUPS -5.5% Clang 14.0.0 (clang-1400.0.29.201) arm64
Aggregate1 +27.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat2 +38.4% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat1 +56.3% Clang 14.0.0 (clang-1400.0.29.201) arm64
IterOfIter1 +97.8% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat2 +148.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
TableDictReader +164.9% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse2 +210.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse1 +252.9% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse1 +262.0% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse2 +263.8% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat1 +490.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
name speed_up py_compiler arch
GroupBy1 - FEW_GROUPS -0.4% Clang 14.0.0 (clang-1400.0.29.201) arm64
GroupBy1 - MANY_GROUPS +0.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
Aggregate1 +28.7% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat2 +37.7% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat1 +56.7% Clang 14.0.0 (clang-1400.0.29.201) arm64
IterOfIter1 +80.4% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat2 +144.3% Clang 14.0.0 (clang-1400.0.29.201) arm64
TableDictReader +167.4% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse2 +216.8% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse1 +257.3% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse1 +258.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse2 +262.3% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat1 +471.9% Clang 14.0.0 (clang-1400.0.29.201) arm64
name speed_up py_compiler arch
GroupBy1 - MANY_GROUPS -3.5% Clang 14.0.0 (clang-1400.0.29.201) arm64
GroupBy1 - FEW_GROUPS -2.8% Clang 14.0.0 (clang-1400.0.29.201) arm64
Aggregate1 +39.3% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat2 +47.5% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat1 +69.5% Clang 14.0.0 (clang-1400.0.29.201) arm64
IterOfIter1 +85.8% Clang 14.0.0 (clang-1400.0.29.201) arm64
TableDictReader +167.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat2 +170.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse2 +223.9% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse1 +263.0% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse2 +265.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse1 +270.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat1 +489.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
name speed_up py_compiler arch
GroupBy1 - MANY_GROUPS +1.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
GroupBy1 - FEW_GROUPS +3.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
Aggregate1 +35.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat2 +47.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeFormat1 +67.0% Clang 14.0.0 (clang-1400.0.29.201) arm64
IterOfIter1 +84.5% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat2 +182.1% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse2 +224.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
DatetimeParse1 +265.2% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse1 +266.0% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateParse2 +275.9% Clang 14.0.0 (clang-1400.0.29.201) arm64
TableDictReader +276.6% Clang 14.0.0 (clang-1400.0.29.201) arm64
DateFormat1 +478.5% Clang 14.0.0 (clang-1400.0.29.201) arm64

In cases where there are multiple speed test results, the worst is taken. See benchmarks on Github for source code.