#496: A lake house in Seattle
Sponsored by Logfire from Pydantic: pythonbytes.fm/logfire
Connect with the hosts
- Michael: Mastodon / BlueSky / X / LinkedIn
- Calvin: Mastodon / BlueSky / X / LinkedIn
- Show: Mastodon / BlueSky / X
Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Tuesday at 7am PT. Older video versions available there too.
Finally, if you want an artisanal digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Calvin #1: Pandas Should Go Extinct
- Pandas' slowness pushes teams toward "Big Data" tools (Spark, Databricks) they don't actually need — most workloads never hit true Big Data scale
- Amazon Redshift telemetry: ~95% of tables are under 100GB, ~87% of queries touch 80GB or less — that's "Medium Data," not Big Data
- Polars and DuckDB fill that gap: single-machine, fast, no cluster required
- 1 Billion Row Challenge benchmark: Pandas took 4m28s vs. Polars 5.04s and DuckDB 5.19s — DuckDB also used 19x less memory
- On a real-world NYC taxi dataset (3GB parquet), pure DuckDB ran 2x faster than pure Pandas while using a fraction of the RAM
- Bonus: Apache Arrow lets you pass data between Pandas/Polars/DuckDB with zero copying, so trying them out doesn't mean a full rewrite
Michael #2: Pydantic-pint puts real-world units in your Pydantic models
Pydantic-pint bridges Pydantic and Pint so models can validate physical quantities like 4m or 12 meters instead of bare floats. Fields annotated with PydanticPintQuantity parse user input, convert between compatible units, and serialize quantities back out as strings. That closes a real gap for anything consuming API payloads, config files, or sensor data with measurements, letting you enforce units at the validation boundary instead of hoping every caller remembered them.
- via PyCoder's Weekly newsletter
- Unit mix-ups have literally crashed spacecraft; now your Pydantic models can refuse them at the door.
- Annotate a field as Annotated[Quantity, PydanticPintQuantity('km')] and inputs like 12 meters arrive auto-converted to kilometers
- Validation covers string, numeric, and quantity inputs, and model_dump_json serializes quantities as readable unit strings
- Installable from PyPI as pydantic-pint, MIT licensed, with docs at pydantic-pint.readthedocs.io
- Early-stage solo project at version 0.4, so API stability and maintenance are open questions worth discussing
Calvin #3: How Libraries Run Rust Inside Python (With PyO3)
- Pydantic v2's validation core (pydantic-core) is Rust under the hood, built with PyO3 — this post shows how that bridge actually works via a small hand-built JSON parser
- Four steps to get Rust into Python: write a normal Rust module, annotate with PyO3 macros (#[pyfunction], #[pymodule]), compile/install with maturin, then just import it
- The parser builds a Rust tree first — Python never touches it until the boundary crossing
- Key insight: converting the Rust result into Python objects (.into_pyobject) is often the expensive part, not the parsing — 100,000 JSON values means ~100,000 Python objects built after parsing's already done
- Errors cross the boundary too: Rust's typed errors convert into real Python exceptions (ValueError, FileNotFoundError) via From/?, so callers get clean Python semantics
- Takeaway for anyone porting Rust in: if you're returning a scalar, don't sweat it; if you're returning a big structure, profile the boundary — that's the real cost, not the algorithm
Michael #4: AWS acquires DuckLabs
Thank you Dylan McConnell.
What does this mean for the DuckDB ecosystem?
DuckDB is the open-source in-process analytical SQL engine. MIT licensed. The IP is not owned by any company - it's held by the nonprofit DuckDB Foundation, which was created when the team spun out of CWI Amsterdam. Peter Boncz, the CWI representative on the Foundation board, describes it as the entity that holds all IP of open-source DuckDB.
DuckLabs (ducklabs.com) is the company, formerly branded DuckDB Labs. Founded a little over five years ago by Hannes Mühleisen and Mark Raasveldt to give the DuckDB team a stable long-term home, bootstrapped deliberately instead of taking VC, grown to 30+ people in Amsterdam, funded by support and feature-prioritization contracts. It employs the core devs. It does not own DuckDB.
DuckLake is one of three projects DuckLabs builds, what they call the Duck Stack: DuckDB, DuckLake, and Quack. DuckLake is the lakehouse format that puts catalog metadata in a SQL database instead of in files on object storage. Quack is newer - an RPC-style protocol that turns DuckDB into a client-server system where both ends are DuckDB instances, slated to stabilize in DuckDB v2.0 in September 2026.
MotherDuck is a separate Seattle company, Jordan Tigani's, selling serverless hosted DuckDB. It was started in partnership with DuckDB Labs and has worked closely with Hannes and Mark for four years. It contracted DuckLabs for engineering work and contributes heavily upstream - three of its engineers are among the top 10 outside contributors to DuckDB. It also sells its own DuckLake offering. Customer and collaborator, never owner.
What the AWS post changes. Amazon bought the company, not the project. DuckLabs joined AWS effective September 1, with the process concluding August 31, 2026. Hannes and Mark keep leading the team and the project's technical direction, the team stays in Amsterdam, and DuckDB stays MIT under the Foundation. AWS gets the people and a direct line to the roadmap. The license protects your code, not your priorities.
Three second-order effects worth tracking:
The Foundation board is the real question. It has three directors: Mühleisen, Raasveldt, and Boncz. Two now work for AWS. Commentary on the deal has focused on exactly this - the license protects the code, not the roadmap. The announced counterweight is governance: a technical advisory board on the Foundation, and opening the extension stack so extensions signed by other developers can run in DuckDB.
MotherDuck immediately moved into the business DuckLabs vacated. It now sells DuckDB enterprise support, which it had avoided because it didn't want to compete with DuckLabs' business model, and says it has explicit blessing from Hannes and Mark now that they're joining Amazon. It also bought Tower.dev the day before the AWS announcement.
Everyone expects an AWS DuckDB service. Tigani says Amazon will likely release one eventually, and welcomes the competition, citing Redshift's failure to slow Snowflake on AWS. The groundwork is already visible: Amazon Quick uses DuckDB to query S3 Tables and has processed over 2.5B queries with it since launching in October 2025.
The DuckLake angle is the one to watch. AWS is heavily committed to Iceberg through S3 Tables, and it just acquired the team behind a competing lakehouse format. The stated plan is to use DuckDB, DuckLake, and Quack together to power a new generation of data services, but which format wins internal priority is unannounced.
Extras
Calvin:
- astral-sh/uv 0.12.12: code-signed release binaries 🥳
Michael:
- My MacBook power supply rebooted to install updates (?!?)
- The Story of VS Code | Official Documentary
- Amazon/AWS acquires DuckLabs (see recent episode on DuckLake)
Joke: We’re agentic now
Episode Transcript
Collapse transcript
00:00
00:05
00:09
00:09
00:10
00:12
00:15
00:19
00:21
00:23
00:25
00:27
00:32
00:33
00:37
00:38
00:38
00:45
00:46
00:47
00:48
00:48
00:50
00:51
00:57
01:01
01:02
01:10
01:11
01:13
01:18
01:21
01:26
01:32
01:36
01:39
01:43
01:45
01:45
01:50
01:54
01:59
02:00
02:01
02:05
02:06
02:11
02:16
02:21
02:26
02:28
02:33
02:36
02:39
02:41
02:44
02:47
02:53
02:58
03:01
03:06
03:11
03:15
03:19
03:21
03:25
03:28
03:33
03:37
03:40
03:41
03:45
03:50
03:52
03:54
03:56
04:01
04:03
04:08
04:11
04:13
04:17
04:20
04:22
04:25
04:28
04:34
04:38
04:40
04:44
04:47
04:49
04:51
04:56
04:57
04:59
05:02
05:06
05:08
05:11
05:14
05:18
05:20
05:24
05:27
05:29
05:31
05:32
05:33
05:35
05:39
05:42
05:46
05:49
05:53
05:57
06:03
06:06
06:09
06:09
06:13
06:16
06:19
06:22
06:25
06:28
06:30
06:33
06:37
06:40
06:42
06:47
06:49
06:50
06:57
06:57
07:00
07:02
07:04
07:07
07:09
07:14
07:17
07:19
07:23
07:27
07:33
07:33
07:36
07:37
07:39
07:39
07:40
07:42
07:43
07:47
07:53
07:58
08:01
08:04
08:07
08:09
08:09
08:11
08:13
08:15
08:17
08:18
08:20
08:22
08:24
08:27
08:28
08:29
08:34
08:40
08:46
08:52
08:58
09:04
09:10
09:15
09:21
09:27
09:31
09:35
09:41
09:42
09:46
09:53
09:53
09:57
09:59
10:00
10:01
10:02
10:04
10:06
10:07
10:09
10:10
10:16
10:17
10:19
10:23
10:25
10:29
10:32
10:34
10:37
10:40
10:42
10:45
10:45
10:49
10:50
10:52
11:00
11:01
11:04
11:09
11:13
11:17
11:18
11:19
11:21
11:22
11:22
11:26
11:29
11:33
11:34
11:36
11:40
11:41
11:45
11:47
11:50
11:54
12:00
12:02
12:05
12:07
12:10
12:11
12:16
12:16
12:20
12:22
12:23
12:26
12:30
12:36
12:39
12:43
12:43
12:47
12:51
12:51
12:54
12:57
13:01
13:02
13:03
13:06
13:07
13:13
13:16
13:22
13:27
13:30
13:35
13:41
13:43
13:45
13:53
14:00
14:06
14:09
14:12
14:16
14:18
14:23
14:26
14:28
14:32
14:37
14:41
14:44
14:48
14:51
14:55
14:59
15:03
15:04
15:09
15:12
15:16
15:21
15:22
15:26
15:30
15:33
15:38
15:41
15:42
15:44
15:51
15:57
15:59
16:03
16:04
16:06
16:10
16:16
16:19
16:23
16:26
16:28
16:32
16:36
16:40
16:44
16:50
16:52
16:55
16:56
17:01
17:03
17:05
17:07
17:08
17:08
17:10
17:15
17:20
17:20
17:21
17:22
17:23
17:28
17:30
17:33
17:39
17:40
17:41
17:47
17:50
17:53
17:55
18:01
18:04
18:04
18:05
18:07
18:08
18:10
18:17
18:19
18:21
18:23
18:29
18:35
18:36
18:38
18:38
18:40
18:45
18:54
18:59
19:06
19:11
19:16
19:19
19:21
19:22
19:26
19:29
19:32
19:34
19:36
19:38
19:41
19:47
19:48
19:51
19:53
19:54
19:56
19:57
20:00
20:03
20:10
20:11
20:14
20:17
20:18
20:19
20:19
20:25
20:27
20:28
20:33
20:39
20:44
20:46
20:49
20:50
20:52
20:56
20:59
21:01
21:05
21:07
21:10
21:13
21:14
21:17
21:18
21:21
21:23
21:23
21:31
21:36
21:39
21:42
21:45
21:48
21:52
21:55
22:00
22:05
22:06
22:07
22:09
22:11
22:15
22:19
22:24
22:30
22:35
22:42
22:46
22:51
22:56
22:56
22:57
23:02
23:07
23:11
23:12
23:15
23:16
23:19
23:21
23:23
23:31
23:33
23:35
23:36
23:37
23:39
23:49
23:55
23:56
23:57
23:59
24:01
24:03
24:05
24:09
24:10
24:11
24:12
24:13
24:15
24:21
24:25
24:29
24:33
24:37
24:40
24:42
24:47
24:52
24:55
25:01
25:02
25:03
25:03
25:04
25:07
25:12
25:15
25:15
25:17
25:22
25:23
25:24
25:24
25:25
25:27
25:29
25:29
25:30
25:35
25:38
25:41
25:41
25:44
25:48
25:49
25:49
25:51
25:54
25:56
25:59
26:00
26:00
26:02
26:03
26:05
26:06
26:12
26:19
26:23
26:29
26:33
26:37
26:39
26:39
26:43
26:44
26:46
26:48
26:49
26:53
26:55
26:56
26:57
27:00
27:03
27:09
27:10
27:18
27:22
27:25
27:26
27:28
27:30
27:33
27:37
27:41
27:45
27:46
27:49
27:53
27:54
27:56
27:58
28:00
28:07
28:12
28:17
28:22
28:27
28:33
28:38
28:43
28:49
28:54
29:00
29:06
29:09
29:14
29:21
29:23
29:25
29:32
29:35
29:35
29:38
29:41
29:44
29:45
29:47
29:48
29:52
29:53
29:54
29:59
30:00
30:01
30:03
30:04
30:06
30:07
30:10
30:15
30:15
30:17
30:19
30:20
30:22
30:26
30:27
30:27
30:31
30:36
30:36
30:39
30:39
30:43
30:46
30:47
30:48
30:50
30:51
30:53
30:56
30:57
30:58
31:01
31:01
31:03
31:04
31:05
31:07
31:07
31:09
31:09
31:12
31:14
31:15
31:16
31:19
31:24
31:28
31:29
31:33
31:34
31:35
31:39
31:40
31:41
31:42
31:44
31:48
31:55
31:59
32:06
32:10
32:16
32:18
32:21
32:24
32:26
32:29
32:30
32:32
32:33
32:34
32:36
32:38
32:39
32:42
32:43
32:44


