Skip to main content

An experimental Python library for parsing GPX files fast.

Project description

fastgpx

An experimental Python library for parsing GPX files fast.

# Get the total length of the tracks in a GPX file:
import fastgpx

gpx = fastgpx.parse("example.gpx")
print(f'{gpx.length_2d()} m')
# Iterate over GPX file:
import fastgpx

gpx = fastgpx.parse("example.gpx")
for track in gpx.tracks:
    print(f'Track: {track.name}')
    print(f'Distance: {track.length_2d()} m')
    if not track.time_bounds.is_empty():
      print(f'Time: {track.time_bounds().start_time} - {track.time_bounds().end_time}')
    for segment in track.segments:
        print(f'Segment: {segment.name}')
        for point in segment.points:
            print(f'Point: {point.latitude}, {point.longitude}')
import fastgpx

locations = [
    fastgpx.LatLong(64, 10),
    fastgpx.LatLong(66, 11),
]
encoded = fastgpx.polyline.encode(locations, precision=6)

decoded = fastgpx.polyline.decode(encoded, precision=6)

Documentation

Requirements

  • Python 3.12+ (Tested with 3.12, 3.13, 3.14)
  • C++23 Compiler (For building fastgpx)

Windows

  • Tested with MSVC 17.12.4+ and Clang-cl 19+.

Linux (Tested on Ubuntu)

  • C++23 compatible runtime (GCC libstdc++ 14+ or Clang libc++ 18.1+)

GPX/XML Performance (Background)

This library came out of the need to extract information from many GPX files fast.

gpxpy is the most popular GPX library for Python. It is very versatile in manipulating GPX files.

However in benchmarking it doesn't perform well.

gpxpy docs says (at time of writing) that it uses lxml is available because it is faster than "minidom" (etree).

When benchmarking that was not the case. It appear that the stdlib XML library has gotten much better since gpxpy was created.

Reference: Open ticket on making etree default: https://github.com/tkrajina/gpxpy/issues/248

fastgpx is not intended as a replacement for gpxpy. It mainly focuses on extracting GPX data fast for performance critical tasks. For the few functionalities that does overlap with gpxpy compatible method calls has been added so that one can quickly swap between fastgpx and gpxy.

Benchmarks

Test machine:

  • AMD Ryzen 7 5800 8-Core, 3.80 GHz
  • 32 GB memory
  • m2 SSD storage

gpxpy benchmarks

Comparing getting the distance of a GPX file using gpxpy vs manually extracting the data using xml_etree, computing distance between points using gpxpy distance functions.

gpxpy without lxml

Running benchmark with 3 iterations...
gpxpy 5463041.784135511 meters
gpxpy 5463041.784135511 meters
gpxpy 5463041.784135511 meters
gpxpy: 11.497863 seconds (Average: 3.832621 seconds)

gpxpy with lxml

Running benchmark with 3 iterations...
gpxpy 5463041.784135511 meters
gpxpy 5463041.784135511 meters
gpxpy 5463041.784135511 meters
gpxpy: 37.803625 seconds (Average: 12.601208 seconds)

xml_etree data extraction

Running benchmark with 3 iterations...
xml_etree 5463043.740615641 meters
xml_etree 5463043.740615641 meters
xml_etree 5463043.740615641 meters
xml_etree: 2.333200 seconds (Average: 0.777733 seconds)

Even with gpxpy using etree to parse the XML it is paster to parse it directly with etree and use gpxpy.geo distance functions to compute the distance of a GPX file. Unclear what the extra overhead is, possibly the cost of extraction additional data. (Some minor difference in how the total distance is computed in this example. Using different options for computing the distance.)

C++ benchmarks

Since XML parsing itself appear to have a significant impact on performance some popular C++ XML libraries was tested:

tinyxml2

Total Length: 5456930.710560566
Elapsed time: 0.4980144 seconds

pugixml

Total Length: 5456930.710560566
Elapsed time: 0.1890089 seconds

C++ vs Python implementations

Running 5 benchmarks with 3 iterations...

Running gpxpy ...
gpxpy: 50.182288 seconds (Average: 16.727429 seconds)

Running xml_etree ...
xml_etree: 8.269050 seconds (Average: 2.756350 seconds)

Running lxml ...
lxml: 8.479702 seconds (Average: 2.826567 seconds)

Running tinyxml (C++) ...
tinyxml (C++): 2.699880 seconds (Average: 0.899960 seconds)

Running pugixml (C++) ...
pugixml (C++): 0.381095 seconds (Average: 0.127032 seconds)

For computing the length of a GPX file, pugixml in a Python C extension was ~140 times faster than using gpxpy.

Encoding/decoding polylines

fastgpx also provide faster alternatives to polyline.encode and polyline.decode:

> uv run benchmark_polyline.py
GPX path: ../gpx/2024 Great Roadtrip
GPX files: 24
Iterations: 10

benchmarking fastgpx.polyline.encode
2.988260000005539

benchmarking polyline.encode
7.145514600000752

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

fastgpx-0.6.3.tar.gz (87.1 kB view details)

Uploaded Source

Built Distributions

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

fastgpx-0.6.3-cp312-abi3-win_arm64.whl (393.3 kB view details)

Uploaded CPython 3.12+Windows ARM64

fastgpx-0.6.3-cp312-abi3-win_amd64.whl (370.2 kB view details)

Uploaded CPython 3.12+Windows x86-64

fastgpx-0.6.3-cp312-abi3-win32.whl (331.1 kB view details)

Uploaded CPython 3.12+Windows x86

fastgpx-0.6.3-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fastgpx-0.6.3-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

File details

Details for the file fastgpx-0.6.3.tar.gz.

File metadata

  • Download URL: fastgpx-0.6.3.tar.gz
  • Upload date:
  • Size: 87.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastgpx-0.6.3.tar.gz
Algorithm Hash digest
SHA256 ae1fb0b250b7aa8e654d84d53143de950f6be1f848e37832bdc5e29ba6e84bfb
MD5 12f18c0604ac77ff4cc951e102c80ca9
BLAKE2b-256 c8155307f645727878fde7142b144dc619c03c9a05fca556a86a8768b3166ddb

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3.tar.gz:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastgpx-0.6.3-cp312-abi3-win_arm64.whl.

File metadata

  • Download URL: fastgpx-0.6.3-cp312-abi3-win_arm64.whl
  • Upload date:
  • Size: 393.3 kB
  • Tags: CPython 3.12+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastgpx-0.6.3-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 a8baf934f67d9b7dfdc063f19e43a72fd520e03edd8b54776940586bd2d44da0
MD5 621792784417c7ad671012942b8a6ee4
BLAKE2b-256 0f3435fcf7d45da0741e7866526dff930254b641a255bceaf2f45d4b0c781f3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3-cp312-abi3-win_arm64.whl:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastgpx-0.6.3-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: fastgpx-0.6.3-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 370.2 kB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastgpx-0.6.3-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3eb49d904c3aabc2fc66e03eeb569d4b19d14a756308c86364f6bb0538be4428
MD5 80a7509777566d80856585d5dc48cc03
BLAKE2b-256 a591e5a45df8890b176ade6cbafe722657ffa3b9d2d123650ee45e00ad5f753a

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3-cp312-abi3-win_amd64.whl:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastgpx-0.6.3-cp312-abi3-win32.whl.

File metadata

  • Download URL: fastgpx-0.6.3-cp312-abi3-win32.whl
  • Upload date:
  • Size: 331.1 kB
  • Tags: CPython 3.12+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastgpx-0.6.3-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 131ff96a77618beac97f8ec756616ff318f0746c7b5aa3b343c95f6ed4487253
MD5 8212ac7cbb0083a64d771585f19de88f
BLAKE2b-256 e2b28448f07d11302e083f014b8895d7e161f038c5e1ff89cd24c2b750a3a5fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3-cp312-abi3-win32.whl:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastgpx-0.6.3-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastgpx-0.6.3-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8913e339f19913bc200df25192aa2e7a90a0957250ca2c55be6545f47065c69b
MD5 428d0bcf76df5ce20aeba6b8cee21c98
BLAKE2b-256 0ec203a3254776a004dcca1a7696b45fe41b12d4fcebac00d653a497c4f65412

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastgpx-0.6.3-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastgpx-0.6.3-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7bf606800977dd4773ee3cf57285d9bf451154fc6cd316550e6108ea1372375e
MD5 09375594b9cf87f905c8dbbb9c7b1942
BLAKE2b-256 4ca13fae6000a7f72ff610f3f909aa66092b6fa804834257b3f633af4db63519

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.3-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on thomthom/fastgpx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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