import numpy as np
from shapely.geometry import Point
p = Point(0.0, 0.0)
x = p.buffer(1.0)
s = x.simplify(0.001, preserve_topology=False)
polygon = np.array( [ p for p in s.exterior.coords])
len(polygon)
65
s
def Area(p):
s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] )
return 0.5*np.abs(np.sum(s))
Area(np.array(polygon))
3.1365484905459393
numbaのバージョンを確認する。この手の話はまだまだ仕様変更があると思われます。
import numba
numba.__version__
'0.46.0'
from numba import jitclass
from numba import float64
spec = [
('polygon', float64[:,:])
]
@jitclass(spec)
class shape(object):
def __init__(self, polygon):
self.polygon = polygon
def Area(self):
p = self.polygon
s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] )
return 0.5*np.abs(np.sum(s))
%%timeit
c = shape(polygon)
c.Area()
13.2 µs ± 229 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
c = shape(polygon)
c.Area()
119 µs ± 614 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
from numba import jitclass
from numba import float64
spec = [
('polygon', float64[:,:])
]
@jitclass(spec)
class model(object):
def __init__(self, polygon):
self.polygon = polygon
def Area(self):
p = self.polygon
s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] )
return 0.5*np.abs(np.sum(s))
spec = [
('model', model.class_type.instance_type)
]
@jitclass(spec)
class shape(object):
def __init__(self, polygon):
self.model = model(polygon)
def Area(self):
return self.model.Area()
%%timeit
c = shape(polygon)
c.Area()
13.6 µs ± 169 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
c = shape(polygon)
c.Area()
122 µs ± 4.52 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
from numba import jitclass
from numba import float64
from numba import types
spec = [
('coordinate', float64[:])
]
@jitclass(spec)
class point(object):
def __init__(self, p):
self.coordinate = p
spec = [
('polygon', types.List(point.class_type.instance_type, reflected=True))
]
@jitclass(spec)
class shape(object):
def __init__(self, polygon):
self.polygon = [point(polygon[i]) for i in range(len(polygon))]
def Area(self):
p = self.polygon
s = np.array( [ p[i-1].coordinate[0]*p[i].coordinate[1] - p[i].coordinate[0]*p[i-1].coordinate[1] for i in range(1, len(p)) ] )
return 0.5*np.abs(np.sum(s))
%%timeit
c = shape(polygon)
c.Area()
22 µs ± 519 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
c = shape(polygon)
c.Area()
115 µs ± 2.58 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)