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}')

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

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.

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.0.tar.gz (86.5 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.0-cp312-abi3-win_arm64.whl (706.3 kB view details)

Uploaded CPython 3.12+Windows ARM64

fastgpx-0.6.0-cp312-abi3-win_amd64.whl (780.8 kB view details)

Uploaded CPython 3.12+Windows x86-64

fastgpx-0.6.0-cp312-abi3-win32.whl (679.7 kB view details)

Uploaded CPython 3.12+Windows x86

fastgpx-0.6.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.3 MB view details)

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

fastgpx-0.6.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.2 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.0.tar.gz.

File metadata

  • Download URL: fastgpx-0.6.0.tar.gz
  • Upload date:
  • Size: 86.5 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.0.tar.gz
Algorithm Hash digest
SHA256 84daa42f7df160e3e887c3384c1f63b0ddeeb83c1171bbe735613296a129854f
MD5 985aaa9dec11457cc5f62d6ed70cedc4
BLAKE2b-256 aa6b03ef7242b85c029e82ac250dad48bd9cabd211d2c54cd894ec561c05821a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: fastgpx-0.6.0-cp312-abi3-win_arm64.whl
  • Upload date:
  • Size: 706.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.0-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 26d785c25e28d71414c5c2e0315be6af092a5b518682b2a71cec18104cf7386a
MD5 d93eef79c977bd6fe6a4538120f78fe1
BLAKE2b-256 0ab0132be1d3e86cc0c0734e829a95a7841d54e8d6314b464e4bf2fae326b002

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: fastgpx-0.6.0-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 780.8 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.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5f25be213fe4009cffafe7a5f7d424cb66ecc3d7458035f4f4e61b0bd9de114a
MD5 b5b7fa7ae22b544ad71ec06dec0bf14e
BLAKE2b-256 3705dfc8e6e836d5c9dfc639dd0afdb71c30e52b6be2812e2c42a18c30ea0fe2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: fastgpx-0.6.0-cp312-abi3-win32.whl
  • Upload date:
  • Size: 679.7 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.0-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 9c73ec54479f75719e3801455223fbd558204f735fa6b1e46fbc6bcb485b60c3
MD5 22aabbf5aaaa7d57b34257873b4dfca0
BLAKE2b-256 0b8e90c75e998e35db4f16037a9d3d33d63a79b95f12c8e85ed29b8541f9b99f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for fastgpx-0.6.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b12b6abb35234614c41fa1e649ff86834bf20ef03259285714f6ee6ff0ac1497
MD5 9fb1273ccd1285486b8d14fe090a0adf
BLAKE2b-256 73ce6a5f53637fc10bc4fabc444699d65725d077f6f6587592e084dddcbf1101

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for fastgpx-0.6.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b5ccd98882973756a211e1d1048082b3e315659f088fc979ef8c801f2a084328
MD5 4692fcec4af5bcb331d0ca74d1e58996
BLAKE2b-256 e921041d498d9ad99d725af34159a85295f974e2bb280dae14c15153fc4a5a8e

See more details on using hashes here.

Provenance

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