Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

textual_fastdatatable-0.1.4.tar.gz (23.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

textual_fastdatatable-0.1.4-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file textual_fastdatatable-0.1.4.tar.gz.

File metadata

  • Download URL: textual_fastdatatable-0.1.4.tar.gz
  • Upload date:
  • Size: 23.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.10.13 Linux/6.2.0-1015-azure

File hashes

Hashes for textual_fastdatatable-0.1.4.tar.gz
Algorithm Hash digest
SHA256 44ee27ff0099fc6618eeebadb64bc6218cb176f9a1d0a085b25fe2974628b04f
MD5 be4f37f4c28a9dbfbc6923fe828226df
BLAKE2b-256 4081c2f1f08729586cfe446193abe1c0045564eb34b5d53488940c3eaab2eb8a

See more details on using hashes here.

File details

Details for the file textual_fastdatatable-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for textual_fastdatatable-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d55d992df320651383e67f3cc46a2aa867c72e3eff7fe7644310cefe0a7fea10
MD5 5ea4355b128079a17c7d8288e274ee68
BLAKE2b-256 9fa73d24d31a7bee65f7a6a338ce18de7d5af71d3d7099339610adb22ebb7ee7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page