An implementation of Haversine distance calculations using Rust and PyO3
Project description
fast-geodist
An implementation of the Haversine formula for calculating Great Circle distance using Rust and PyO3.
This package was started as an experiment for learning how to implement functions in Rust and wrap them for use in python. The Haversine Formula is implemented following georust, with an array-wise implementation written using ndarray::parallel
. It is wrapped for python using Maturin and integrates rust-numpy
for array operations.
Installation
pip install fast-geodist
Quick start
The package provides two main entry points:
import numpy as np
from fast_geodist import haversine
# input either a tuple of (lat/lon, lat/lon)
result = haversine((1, 1, 0, 0))
# or a numpy array of coordinates pairs
# useful if lots of distances need to be calculated
# will be computed in parallel
result = haversine(np.array([(1, 1, 0, 0), (2, 2, 0, 0)]))
Benchmarks
The results of benchmarking show the rust implementation is 14x faster than the python implementation. This benchmark computes distances on an array containing 1,000,000 pairs of coordinates (see bench.py
):
--------------------------------------------- benchmark: 2 tests ---------------------------------------------
Name (time in ms) Min Max Mean Median
--------------------------------------------------------------------------------------------------------------
test_benchmark_fast 164.0635 (1.0) 171.7663 (1.0) 168.0218 (1.0) 168.4129 (1.0)
test_benchmark_slow 2,335.4281 (14.23) 2,439.7850 (14.20) 2,395.6077 (14.26) 2,406.6356 (14.29)
--------------------------------------------------------------------------------------------------------------
Computed on an Intel i7-1165G7.
Development
Prequisites:
- Python (>=3.7) and make
- Rust toolchain
After cloning the repository, the Makefile includes helpful commands for setting up a development environment, linting, formatting, testing, and benchmarking. Get started as follows:
# setup a new virtual environment
python -m venv .venv
source .venv/bin/activate
# install the development dependencies
make install
# check other available commands
make help
Tooling:
- Cargo and Pytest are used for testing the Rust and Python code respectively (see
/tests
). - Python code is linted using flake8 and formatted using Black; rust code with
cargo fmt
andcargo clippy
. - pre-commit is used to run these checks locally before files are pushed to git
- The Github Actions pipeline runs these checks and tests
- Semantic-release is used with conventional commits for automated releasing to PyPI
References
As well as the excellent PyO3 documentation, the following posts helped with creation of this package:
- https://blog.yossarian.net/2020/08/02/Writing-and-publishing-a-python-module-in-rust
- https://depth-first.com/articles/2020/08/10/python-extensions-in-pure-rust-with-pyo3/
- http://saidvandeklundert.net/learn/2021-11-18-calling-rust-from-python-using-pyo3/
- https://itnext.io/how-to-bind-python-numpy-with-rust-ndarray-2efa5717ed21
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
File details
Details for the file fast_geodist-0.4.0.tar.gz
.
File metadata
- Download URL: fast_geodist-0.4.0.tar.gz
- Upload date:
- Size: 11.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef291fd2119be372b198f106b820af98858481319f5192fbe012f4430b51ccf0 |
|
MD5 | da36836f006a2125614d2c4c04e6d88e |
|
BLAKE2b-256 | 1366b9cd4cf7198e85e0e34beafefa61ba932532afce82c34b944ff46a439c91 |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-win_amd64.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-win_amd64.whl
- Upload date:
- Size: 179.5 kB
- Tags: CPython 3.7+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4eb25ab9b1c73b89dda6297de76e558c69b97733a4f0c901ea0fb0d3294dc6a0 |
|
MD5 | 818489a77c57f24bee5b9ceed4681d4f |
|
BLAKE2b-256 | e4b6cc7c935a9d52198911ce001d124448e0cd43fa3b1dc143de45138f5b2d5f |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-win32.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-win32.whl
- Upload date:
- Size: 171.1 kB
- Tags: CPython 3.7+, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 22015b0999ac1a20f4a5730ccb453c0f846c69a7201a1a68e43dfefb9914f606 |
|
MD5 | ee9c9503ccc6a374c1d9be45cbbc920a |
|
BLAKE2b-256 | d87519b18623ded8f73b0726a97ce51573038aba4593660903350dee522f2231 |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.7+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c963823ed66324b9aab55016b5d502573777738137e5108a098d8efdb4b49136 |
|
MD5 | d7060260daf4242ea2779d7c9a80ef9e |
|
BLAKE2b-256 | e8c04ba5983c10ef3aa49a2f93aed352dcdbd8adba5e232ecc24b5de6a6e6958 |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.7+, manylinux: glibc 2.17+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9f7778a7069133a038464cda56c9dc6978dd9a4a2ee3e76e4a29539d5d804f47 |
|
MD5 | 2882a8e2cd41b3247ea6b3309111562d |
|
BLAKE2b-256 | 284352049780560b4fa2b0091704500ebcdd754c8203f37a9ceab107b74c18ce |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
- Upload date:
- Size: 597.1 kB
- Tags: CPython 3.7+, macOS 10.9+ universal2 (ARM64, x86-64), macOS 10.9+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 312d8576c1910bf8b92b6bca0e6a9b94e5e46e67f6168022c875e4ea2bf18ad8 |
|
MD5 | 47e8937a54de60fb332370714ec30a52 |
|
BLAKE2b-256 | adea14dbfcd3c8c33177bf1a29e2a3d8ec15ea04bec5ea704b0b9561cc08b370 |
File details
Details for the file fast_geodist-0.4.0-cp37-abi3-macosx_10_7_x86_64.whl
.
File metadata
- Download URL: fast_geodist-0.4.0-cp37-abi3-macosx_10_7_x86_64.whl
- Upload date:
- Size: 305.4 kB
- Tags: CPython 3.7+, macOS 10.7+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/0.13.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 35d42fed6371e00a46555b56016b30eeffc9329c7074b7351baaa8308516f273 |
|
MD5 | 32b5b733aae49a0268cfe67040a7341f |
|
BLAKE2b-256 | ee3ac7e1b014a35375b95238110fe63c2a8829db7eb988c40a4e442056906f11 |