A performance-focused reimplementation of Textual's DataTable widget, with a pluggable data storage backend.
Project description
textual-fastdatatable
A performance-focused reimplementation of Textual's DataTable widget, with a pluggable data storage backend.
Textual's built-in DataTable widget is beautiful and powerful, but it can be slow to load large datasets.
Here are some benchmarks on my relatively weak laptop. For each benchmark, we initialize a Textual App that loads a 6-column dataset from a parquet file and mounts a data table:
Records | Built-in DataTable | FastDataTable |
---|---|---|
100 | 0.21s | 0.12s |
1000 | 0.50s | 0.12s |
10000 | 3.78s | 0.12s |
100000 | 37.84s | 0.14s |
538121 | 231.17s | 0.18s |
NB: FastDataTable currently does not support rows with a height of more than one line. See below for more limitations, relative to the built-in DataTable.
Installation
pip install textual-fastdatatable
Usage
If you already have data in Apache Arrow or another common table format:
from textual_fastdatatable import DataTable
data_table = DataTable(data = my_data)
The currently supported types are:
AutoBackendType = Union[
pa.Table,
pa.RecordBatch,
Path, # to parquet only
str, # path to parquet only
Sequence[Iterable[Any]],
Mapping[str, Sequence[Any]],
]
To override the column labels and widths supplied by the backend:
from textual_fastdatatable import DataTable
data_table = DataTable(data = my_data, column_labels=["Supports", "[red]Console[/]", "Markup!"], column_widths=[10, 5, None])
You can also pass in a backend
manually (if you want more control or want to plug in your own).
from textual_fastdatatable import ArrowBackend, DataTable, create_backend
backend = create_backend(my_data)
backend = ArrowBackend(my_arrow_table)
# from python dictionary in the form key: col_values
backend = ArrowBackend.from_pydict(
{
"col one": [1, 2, 3 ,4],
"col two": ["a", "b", "c", "d"],
}
)
# from a list of tuples or another sequence of iterables
backend = ArrowBackend.from_records(
[
("col one", "col two"),
(1, "a"),
(2, "b"),
(3, "c"),
(4, "d"),
]
)
# from a path to a Parquet file:
backend = ArrowBackend.from_parquet("path/to/file.parquet")
Limitations and Caveats
The DataTable
does not currently support rows with a height of more than one line. Only the first line of each row will be displayed.
The ArrowBackend
is optimized to be fast for large, immutable datasets. Mutating the data,
especially adding or removing rows, may be slow.
The ArrowBackend
cannot be initialized without data, however, the DataTable can (either with or without column_labels
).
The ArrowBackend
cannot store arbitrary Python objects or Rich Renderables as values. It may widen types to strings unnecessarily.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for textual_fastdatatable-0.1.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4cf209c9e038f6ae2ed27158c4ef7c3bcb82ba707b3b5cbf2fd47579d17fab88 |
|
MD5 | f814da35f5e02f861378cba637b79cd5 |
|
BLAKE2b-256 | e3b79c1191f9695621111b31fb2023df32e517785bd320c1616155668bff22e5 |
Hashes for textual_fastdatatable-0.1.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8e0d7639db07bd031879a164a50cc8c62e04c6e07696d3292f502d1caa030d9c |
|
MD5 | e240055749bb583c273a565bc9f993b7 |
|
BLAKE2b-256 | 3bd7fc3ceccc780aff04e502e97c844b8a7e838f5728428a50601ea4469109a8 |