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)
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f913edddc6374567bb63dff5ae1da9e89ce41f191e0b49d57cfaf2db50947111
|
|
| MD5 |
8c6f353390865f9d0d339e2ec02cc18c
|
|
| BLAKE2b-256 |
96b824d7340422a822efcd964508d44f2d3808ed437207621f940506e37c7b9a
|
Provenance
The following attestation bundles were made for fastgpx-0.6.2.tar.gz:
Publisher:
wheels.yml on thomthom/fastgpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2.tar.gz -
Subject digest:
f913edddc6374567bb63dff5ae1da9e89ce41f191e0b49d57cfaf2db50947111 - Sigstore transparency entry: 738072525
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db19a0dbe27bd3ff30f0117d4af2ed1e82e09af7ff5f5b2292a000759c8209ec
|
|
| MD5 |
33e4c1bc63d67f6f7a7c1fcb1fd663a3
|
|
| BLAKE2b-256 |
d115748d61e788c4b746a92c2b44a552ef3461100c5269aa3d668c686e729264
|
Provenance
The following attestation bundles were made for fastgpx-0.6.2-cp312-abi3-win_arm64.whl:
Publisher:
wheels.yml on thomthom/fastgpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2-cp312-abi3-win_arm64.whl -
Subject digest:
db19a0dbe27bd3ff30f0117d4af2ed1e82e09af7ff5f5b2292a000759c8209ec - Sigstore transparency entry: 738072528
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebaa17d834ae99e09315ff7a01db0730806d6769de731e074a325c094c55bd21
|
|
| MD5 |
8adcc6605181c9579e40788cc3cfbf15
|
|
| BLAKE2b-256 |
4633bf2061955ffb63c68cbe010508e081b5ee2d353d14407a9af429bba07315
|
Provenance
The following attestation bundles were made for fastgpx-0.6.2-cp312-abi3-win_amd64.whl:
Publisher:
wheels.yml on thomthom/fastgpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2-cp312-abi3-win_amd64.whl -
Subject digest:
ebaa17d834ae99e09315ff7a01db0730806d6769de731e074a325c094c55bd21 - Sigstore transparency entry: 738072542
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fbef1b0df809b0314aa3f07f59bd0a7a7ece1f442136016f3e711966cbba022
|
|
| MD5 |
446562ddb05f0e32d207266e5fd02675
|
|
| BLAKE2b-256 |
f448ab96acba5abd17349f6a48376f27745ec197295b46ed63dba0eadca04369
|
Provenance
The following attestation bundles were made for fastgpx-0.6.2-cp312-abi3-win32.whl:
Publisher:
wheels.yml on thomthom/fastgpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2-cp312-abi3-win32.whl -
Subject digest:
4fbef1b0df809b0314aa3f07f59bd0a7a7ece1f442136016f3e711966cbba022 - Sigstore transparency entry: 738072531
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
- Download URL: fastgpx-0.6.2-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.6 MB
- Tags: CPython 3.12+, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0f38561d861c320b7f5154106328e690cf0c155115af108ae4df74844a44445
|
|
| MD5 |
a2c534c6ed60c25d040b145a41ff721a
|
|
| BLAKE2b-256 |
c26fb041de1f763fd73376925db5d84e1e23f5d6ec90cb8820b585ff77024742
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
b0f38561d861c320b7f5154106328e690cf0c155115af108ae4df74844a44445 - Sigstore transparency entry: 738072539
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file fastgpx-0.6.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: fastgpx-0.6.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 3.5 MB
- Tags: CPython 3.12+, manylinux: glibc 2.26+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfd5cfe206a3b38e466eb547d884f2b3a09a445370b237d11ee8afe9a3980806
|
|
| MD5 |
5ef527f8ed3b4c879163d5d46384653a
|
|
| BLAKE2b-256 |
49446c6a579aecbc39c7ab5d576903995e822bb0ccd670683d59eaddeba0021b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgpx-0.6.2-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl -
Subject digest:
dfd5cfe206a3b38e466eb547d884f2b3a09a445370b237d11ee8afe9a3980806 - Sigstore transparency entry: 738072534
- Sigstore integration time:
-
Permalink:
thomthom/fastgpx@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/thomthom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@2edce49b782d8b7bbd7dda05370a9e78f7c30af6 -
Trigger Event:
workflow_dispatch
-
Statement type: