Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add benchmark notes / unittests #2

Open
thehesiod opened this issue Nov 7, 2016 · 2 comments
Open

Add benchmark notes / unittests #2

thehesiod opened this issue Nov 7, 2016 · 2 comments

Comments

@thehesiod
Copy link

thehesiod commented Nov 7, 2016

I've been searching for the fastest geodesic library for python and it seems yours is by far the fastest. This makes me both worried that some edge case is missing and at the same time very impressed :)

If the algorithm is indeed correct I suggest adding unittests and benchmark results to the front page in github.

Here is my benchmark code and results:

import time
from contextlib import contextmanager
from geographiclib.geodesic import Geodesic as geographic_geodesic
import vincenty
import geopy.distance

@contextmanager
def timeit(title, iterations):
    t1 = time.clock()
    yield
    t2 = time.clock()
    elapsed = t2 - t1
    print('%s: elapsed:%0.2fs o/s:%0.2f iterations:%d' % (title, elapsed, iterations / elapsed, iterations))

def time_iter(iterations, func, *args, pre_test=None, **kwargs):
    with timeit("{}.{}".format(func.__module__, func.__name__), iterations):
        for _ in range(iterations):
            if pre_test:
                pre_test()
            val = func(*args, **kwargs)
    print(val)

# latitude/longitude
newport_ri = (41.49008, -71.312796)
cleveland_oh = (41.499498, -81.695391)

def test_geographiclib():
    return geographic_geodesic.WGS84.Inverse(newport_ri[0], newport_ri[1], cleveland_oh[0], cleveland_oh[1], geographic_geodesic.DISTANCE)['s12'] / 1000

def test_geopy():
    return geopy.distance.vincenty(newport_ri, cleveland_oh).kilometers

num_iter = 50000
time_iter(num_iter, test_geopy)
time_iter(num_iter, test_geographiclib)
time_iter(num_iter, vincenty.vincenty, newport_ri, cleveland_oh)

results

__main__.test_geopy: elapsed:0.24s o/s:41574.34 iterations:10000
866.4554329011002
__main__.test_geographiclib: elapsed:1.71s o/s:5854.28 iterations:10000
866.4554329098687
vincenty.vincenty_inverse: elapsed:0.16s o/s:61436.01 iterations:10000
866.455433

as you can see they have similar results, with vincenty reduced by a few decimal digits, however vincenty is 30% faster than geopy and ~10x faster than geographiclib. Btw let me know if you know how to test against the gdist library, would be good to add.

@thehesiod thehesiod changed the title Add benchmark notes Add benchmark notes / unittests Nov 7, 2016
@maurycyp
Copy link
Owner

Hi @thehesiod . FYI, there are a few doctests that handle some basic edge cases here: https://github.com/maurycyp/vincenty/blob/master/vincenty/__init__.py#L19 .

The algorithm comes from Wikipedia (linked in the README) so there's nothing unusual in my approach.

I'll play with your code and if will add it if everything checks out, thanks!

@thehesiod
Copy link
Author

btw here are some testcases: http://geographiclib.sourceforge.net/2009-03/geodesic.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants