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.2.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.2-cp312-abi3-win_arm64.whl (314.7 kB view details)

Uploaded CPython 3.12+Windows ARM64

fastgpx-0.6.2-cp312-abi3-win_amd64.whl (381.1 kB view details)

Uploaded CPython 3.12+Windows x86-64

fastgpx-0.6.2-cp312-abi3-win32.whl (339.0 kB view details)

Uploaded CPython 3.12+Windows x86

fastgpx-0.6.2-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.2-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.2.tar.gz.

File metadata

  • Download URL: fastgpx-0.6.2.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.2.tar.gz
Algorithm Hash digest
SHA256 f913edddc6374567bb63dff5ae1da9e89ce41f191e0b49d57cfaf2db50947111
MD5 8c6f353390865f9d0d339e2ec02cc18c
BLAKE2b-256 96b824d7340422a822efcd964508d44f2d3808ed437207621f940506e37c7b9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2.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.2-cp312-abi3-win_arm64.whl.

File metadata

  • Download URL: fastgpx-0.6.2-cp312-abi3-win_arm64.whl
  • Upload date:
  • Size: 314.7 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.2-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 db19a0dbe27bd3ff30f0117d4af2ed1e82e09af7ff5f5b2292a000759c8209ec
MD5 33e4c1bc63d67f6f7a7c1fcb1fd663a3
BLAKE2b-256 d115748d61e788c4b746a92c2b44a552ef3461100c5269aa3d668c686e729264

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2-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.2-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: fastgpx-0.6.2-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 381.1 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.2-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 ebaa17d834ae99e09315ff7a01db0730806d6769de731e074a325c094c55bd21
MD5 8adcc6605181c9579e40788cc3cfbf15
BLAKE2b-256 4633bf2061955ffb63c68cbe010508e081b5ee2d353d14407a9af429bba07315

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2-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.2-cp312-abi3-win32.whl.

File metadata

  • Download URL: fastgpx-0.6.2-cp312-abi3-win32.whl
  • Upload date:
  • Size: 339.0 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.2-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 4fbef1b0df809b0314aa3f07f59bd0a7a7ece1f442136016f3e711966cbba022
MD5 446562ddb05f0e32d207266e5fd02675
BLAKE2b-256 f448ab96acba5abd17349f6a48376f27745ec197295b46ed63dba0eadca04369

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2-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.2-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastgpx-0.6.2-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0f38561d861c320b7f5154106328e690cf0c155115af108ae4df74844a44445
MD5 a2c534c6ed60c25d040b145a41ff721a
BLAKE2b-256 c26fb041de1f763fd73376925db5d84e1e23f5d6ec90cb8820b585ff77024742

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2-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.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastgpx-0.6.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dfd5cfe206a3b38e466eb547d884f2b3a09a445370b237d11ee8afe9a3980806
MD5 5ef527f8ed3b4c879163d5d46384653a
BLAKE2b-256 49446c6a579aecbc39c7ab5d576903995e822bb0ccd670683d59eaddeba0021b

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastgpx-0.6.2-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