Python中减少函数调用开销

2024-06-07 19:06:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我开发了一个应用程序来模拟在网格中移动的N机器人,试图在有限的步数内最大化访问网格单元的数量,在一个目标点上相遇。一切都正常,但速度太慢了。它目前是python+numpy+mathplotlib。在

最大机器人数量可以有一个软限制100(如果它可以得到更高,这是很好的)。在

为此,我做了以下简化操作:

while steps > 0:
    for robot in robots:
        agent.calc(robot,steps)

机器人是一个1x2纽比阵列(x和y坐标)。在

这里的代理决定该怎么做。因为我需要在飞行中转换战术和战略,所以我不能改变这种逻辑。在

代理.calc更新到位的机器人,一个接一个。在

cProfiling它返回following。拔出顶部

^{pr2}$

我为机器人实现了不同的环境,最重要的是squaregird。每个环境都有自己的距离函数,因为我打算使用不同的度量,即曼哈顿/出租车和欧几里得。我将距离函数提取到own距离.py文件,因为我经常使用它。在

我们可以看到taxicab_distance被称为alot,因为代理需要评估一个机器人四个邻居和它自己到一个目标点的距离,以确定下一个位置是否仍能到达目标,并将与所有其他机器人的距离最大化作为一种优化启发式方法。在

函数没有做任何花哨的事情,只是

def taxicab_distance(u, v):
    return np.abs(u[0] - v[0]) + np.abs(u[1] - v[1])

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

长途电话链:代理->;环境.距离->;出租车距离

问题是,如何减少调用函数的开销?我强烈考虑使用pythonsc的可扩展性cython,更具体地说。能用吗?为什么这么慢还有别的原因吗?在


Tags: 函数numpy网格距离代理目标数量环境
2条回答

首先,我把它改写成:

def taxicab_distance(u, v):
     return np.sum(np.abs(u - v))

你能同时计算出许多机器人的taxicab_distance吗?在

我用内联测试了它,它用了大约15秒。最后,我重新编写了C++中的数字压缩,并使用Cython进行集成。之后,只花了1秒。在

编辑:cpython->;cython

相关问题 更多 >

    热门问题