La voie la plus rapide à la formule de lacet

j'ai fait une fonction qui calcule la zone polygone avec Lacet.

cela fonctionne parfaitement mais en ce moment je me demande s'il n'y a pas un moyen plus rapide d'avoir le même résultat. Je veux savoir que parce que cette fonction doit travailler plus vite avec polygone avec beaucoup de coordonnées.

ma fonction:

def shoelace_formula(polygonBoundary, absoluteValue = True):
    nbCoordinates = len(polygonBoundary)
    nbSegment = nbCoordinates - 1

    l = [(polygonBoundary[i+1][0] - polygonBoundary[i][0]) * (polygonBoundary[i+1][1] + polygonBoundary[i][1]) for i in xrange(nbSegment)]

    if absoluteValue:
        return abs(sum(l) / 2.)
    else:
        return sum(l) / 2.

mon polygone:

polygonBoundary = ((5, 0), (6, 4), (4, 5), (1, 5), (1, 0))

résultat:

22.

des idées?

j'essaie avec Numpy : C'est le plus rapide, mais vous devez d'abord convertir vos coordonnées.

import numpy as np
x, y = zip(*polygonBoundary)

def shoelace_formula_3(x, y, absoluteValue = True):

    result = 0.5 * np.array(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))
    if absoluteValue:
        return abs(result)
    else:
        return result
1
demandé sur Guilhain 2016-12-10 18:35:06

1 réponses

Voici une version qui utilise 1/2 fois plus de multiplications: https://stackoverflow.com/a/717367/763269

si vous avez besoin de performances encore plus grandes, Vous pouvez envisager de le faire dans une extension Python C. C peut être beaucoup plus rapide que Python, surtout pour les opérations mathématiques -- parfois 100-1000x.

0
répondu Chris Johnson 2017-05-23 12:13:54