Benchmarks
Computed-column UDF calls: insert, read, recompute, update
On 1000 rows a local stand-in UDF ran 1000 times on insert, 0 times when a select read the stored column, 1000 times on recompute_columns, and 100 times when 100 titles changed. No hosted LLM was called, and the page publishes call counts, not a cost. 1,000,000 rows were not run.
Updated
How to run
python benchmarks/run.py --writeOr: PIXELTABLE_HOME=$(mktemp -d) python benchmarks/scenarios/udf_calls.py --rows 1000 --changed 100 --out /tmp/udf.json --scale reduced
Results
Insert: 1000 UDF calls, 0.089 s wall, 0.081 s CPU. Stored read: 0 UDF calls, 0.016 s wall, 0.014 s CPU.
Full recompute: 1000 UDF calls, 0.087 s wall, 0.079 s CPU. Update of 100 rows: 100 UDF calls, 0.022 s wall, 0.014 s CPU.
- Rows
- 1000
- Insert UDF calls
- 1000
- Stored-read UDF calls
- 0
- Full-recompute UDF calls
- 1000
- Subset-update UDF calls
- 100
- Hosted LLM called
- no
Methods
- Scale of this page
- reduced: 1000 rows, change 100
- Full scale (not run here)
- 1,000,000 rows. The suite flag is --rows 1000000.
- UDF
- fake_llm in benchmarks/udfs.py. Writes a counter file. Returns the first 24 characters. Not an API call.
- Stored read
- select of the computed column after insert. It reads the stored values, so it is expected to call the UDF zero times.
- Machine
- Intel(R) Xeon(R) Processor, 4 cores, 15.6 GB, Linux 6.12.94+, Python 3.12.3, pixeltable 0.7.21
- Recorded
- 2026-10-28, command python benchmarks/run.py --write
Limitations
- No hosted model ran. Call counts measure when Pixeltable runs the UDF, not GPT latency or price.
- Each step ran once, with no warmup, so every time is one sample. scripts/release-bench repeats its runs.
- 1,000,000 rows were not run.
- File I/O inside the stand-in UDF is part of the wall time. A real HTTP client would look different.
Where Pixeltable fits
If you want to fire a new HTTP call on every read, Pixeltable is the wrong tool. A computed column runs when its inputs change, and a read returns the stored value. That is what this page counted.
import pixeltable as pxtfrom pixeltable.functions.openai import chat_completionsTableModel = pxt.model_base()class Notes(TableModel, name='notes'):text: pxt.Stringsummary = chat_completions(messages=[{'role': 'user', 'content': text}],model='gpt-4o-mini',).choices[0].message.content
Questions
Does reading a computed column call the UDF again?
No. A select reads the stored value: 0 UDF calls on this run. The UDF runs on insert, on recompute_columns (1000 calls), and for the rows an update changes (100 calls).