python 调用函数 开销_减少python中的函数调用开销

我开发了一个应用程序,它模拟在网格中移动的N个机器人,这些机器人试图在有限的步骤中最大化访问的网格单元的数量,在目标点进行会议.这一切都正常,但是很慢.它目前是python numpy mathplotlib.

那里的最大机器人可以有100的软限制(如果它可以变得更高,那么它很好).

为此,我做了以下简化:

while steps > 0:

for robot in robots:

agent.calc(robot,steps)

机器人是1×2 numpy数组(x和y坐标).

这里的代理人决定做什么.由于我需要动态切换策略和策略,我无法改变这种逻辑.

agent.calc一个接一个地更新机器人.

cProfiling它返回following.提取顶部

39014272 function calls (39010490 primitive calls) in 150.314 seconds

Ordered by: internal time

ncalls tottime percall cumtime percall filename:lineno(function)

12417735 62.807 0.000 62.807 0.000 distance.py:8(taxicab_distance)

124596 36.882 0.000 36.882 0.000 {numpy.core.multiarray.array}

113657 30.204 0.000 100.800 0.001 logical_agent.py:16(choose_max_distance_to...)

12417013 6.579 0.000 69.384 0.000 squaregrid.py:30(distance)

113700 2.900 0.000 109.769 0.001 logical_agent.py:73(calc)

11652363 2.625 0.000 2.625 0.000 {method 'append' of 'list' objects}

161849 1.653 0.000 1.653 0.000 distance.py:11(euclidean_distance)

113664 1.632 0.000 1.632 0.000 {sorted}

114834 1.185 0.000 1.185 0.000 {method 'keys' of 'dict' objects}

113700 0.695 0.000 1.134 0.000 squaregrid.py:19(neighbours)

我为机器人实施了不同的环境,最重要的是方形.每个环境都有自己的距离函数,因为我打算使用不同的指标,即曼哈顿/出租车和欧几里德.我将距离函数提取到一个自己的distance.py文件中,因为我在几次使用它.

可以看出,taxicab_distance被称为很多,因为代理需要评估机器人四个邻居及其自身到目标点的距离,以查看下一个位置是否仍然可以到达目标并最大化到所有其他机器人的距离优化启发式.

该功能不做任何花哨的事情

def taxicab_distance(u, v):

return np.abs(u[0] - v[0]) + np.abs(u[1] - v[1])

我知道python具有相当高的函数调用开销,我认为这会影响性能. {numpy.core.multiarray.array}可以忽略,我想我知道我在那里做错了什么.

远程呼叫链:代理 – > environment.distance – > taxicab_distance

问题是,如何减少调用函数的开销?我强烈考虑使用pythons c extensibility,cython,更具体.它会起作用吗?还有另一个原因导致它如此缓慢吗?

解决方法:

首先,我将其重写为:

def taxicab_distance(u, v):

return np.sum(np.abs(u - v))

你能一次为很多机器人计算taxicab_distance吗?

标签:python,numpy,cython,performance,overhead-minimization

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值