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 dataset from a parquet file and mounts a data table; it then scrolls around the table (10 pagedowns and 15 right arrows).

For the built-in table and the others marked "from Records", the data is loaded into memory before the timer is started; for the "Arrow from Parquet" back-end, the timer is started immediately.

The times in each column represent the time to the first paint of the table, and the time after scrolling is completed (we wait until the table is fully rendered after each scroll):

Records Built-In DataTable FastDataTable (Arrow from Parquet) FastDataTable (Arrow from Records) FastDataTable (Numpy from Records)
lap_times_100.parquet 0.019s / 1.716s 0.012s / 1.724s 0.011s / 1.700s 0.011s / 1.688s
lap_times_1000.parquet 0.103s / 1.931s 0.011s / 1.859s 0.011s / 1.799s 0.015s / 1.848s
lap_times_10000.parquet 0.977s / 2.824s 0.013s / 1.834s 0.016s / 1.812s 0.078s / 1.869s
lap_times_100000.parquet 11.773s / 13.770s 0.025s / 1.790s 0.156s / 1.824s 0.567s / 2.347s
lap_times_538121.parquet 62.960s / 65.760s 0.077s / 1.803s 0.379s / 2.234s 3.324s / 5.031s
wide_10000.parquet 5.110s / 10.539s 0.024s / 3.373s 0.042s / 3.278s 0.369s / 3.461s
wide_100000.parquet 51.144s / 56.604s 0.054s / 3.294s 0.429s / 3.642s 3.628s / 6.732s

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 DataTable does not currently support row labels.

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.2.1.tar.gz (26.5 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.2.1-py3-none-any.whl (26.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: textual_fastdatatable-0.2.1.tar.gz
  • Upload date:
  • Size: 26.5 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.2.1.tar.gz
Algorithm Hash digest
SHA256 d66581d0d9f6b5dccf364a405e6e5cb733e1cacddc612b4f61dee06d1aac7b5e
MD5 0f4ab09d1db0cd5d5c2d829aa5afc3a2
BLAKE2b-256 14055d1bad7914076ade27794f3d514b15966d46b6cf879e6959c33ea129ee01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for textual_fastdatatable-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 40416bae8897ca1d26e48d32076f44a12e250de98973601e70aae60da376ec62
MD5 b0320834a4446e57c1001c29108f58c2
BLAKE2b-256 1a7105c24063f43d7178bda38a65fd930ead8e640cc3f5cbc7f5935a61f6c778

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