python页面跳转太快如何判断是否有这个total_matplotlib-检查点是否在python中的多边形内的最快方法是什么...

这篇博客介绍了如何利用Numba库来提高Python中多边形内判断算法的性能。通过装饰器@jit(nopython=True)和numpy数组,可以将经典算法移植到Numba,并实现首次调用后的快速执行。文章还展示了如何预编译代码以进一步提升速度,以及如何使用b1编译器进行编译和优化。经过优化,函数执行时间显著减少。
摘要由CSDN通过智能技术生成

如果速度是您所需要的并且没有额外的依赖关系,那么您可能会发现b1非常有用(现在,在任何平台上都非常容易安装)。 通过使用f8[:,:]装饰器并将多边形转换为numpy数组,可以轻松地将您建议的经典b1方法移植到f8。 该代码应如下所示:

@jit(nopython=True)

def ray_tracing(x,y,poly):

n = len(poly)

inside = False

p2x = 0.0

p2y = 0.0

xints = 0.0

p1x,p1y = poly[0]

for i in range(n+1):

p2x,p2y = poly[i % n]

if y > min(p1y,p2y):

if y <= max(p1y,p2y):

if x <= max(p1x,p2x):

if p1y != p2y:

xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x

if p1x == p2x or x <= xints:

inside = not inside

p1x,p1y = p2x,p2y

return inside

第一次执行将比随后的任何调用花费更长的时间:

%%time

polygon=np.array(polygon)

inside1 = [numba_ray_tracing_method(point[0], point[1], polygon) for

point in points]

CPU times: user 129 ms, sys: 4.08 ms, total: 133 ms

Wall time: 132 ms

经过编译后将减少为:

CPU times: user 18.7 ms, sys: 320 µs, total: 19.1 ms

Wall time: 18.4 ms

如果您在第一次调用该函数时需要提高速度,则可以使用b1在模块中预编译代码。将该函数存储在src.py中,如下所示:

from numba import jit

from numba.pycc import CC

cc = CC('nbspatial')

@cc.export('ray_tracing', 'b1(f8, f8, f8[:,:])')

@jit(nopython=True)

def ray_tracing(x,y,poly):

n = len(poly)

inside = False

p2x = 0.0

p2y = 0.0

xints = 0.0

p1x,p1y = poly[0]

for i in range(n+1):

p2x,p2y = poly[i % n]

if y > min(p1y,p2y):

if y <= max(p1y,p2y):

if x <= max(p1x,p2x):

if p1y != p2y:

xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x

if p1x == p2x or x <= xints:

inside = not inside

p1x,p1y = p2x,p2y

return inside

if __name__ == "__main__":

cc.compile()

使用b1构建它并运行:

import nbspatial

import numpy as np

lenpoly = 100

polygon = [[np.sin(x)+0.5,np.cos(x)+0.5] for x in

np.linspace(0,2*np.pi,lenpoly)[:-1]]

# random points set of points to test

N = 10000

# making a list instead of a generator to help debug

points = zip(np.random.random(N),np.random.random(N))

polygon = np.array(polygon)

%%time

result = [nbspatial.ray_tracing(point[0], point[1], polygon) for point in points]

CPU times: user 20.7 ms, sys: 64 µs, total: 20.8 ms

Wall time: 19.9 ms

在我使用的数字代码中:     'b1(f8,f8,f8 [:,:])'

为了使用b1进行编译,需要在f8之前声明每个var。

在prebuild src代码行中:

@cc.export('ray_tracing' , 'b1(f8, f8, f8[:,:])')

用于声明函数名称及其I / O var类型,一个布尔输出b1和两个浮点数f8,以及一个浮点数的二维数组f8[:,:]作为输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值