我开发了一个应用程序来模拟在网格中移动的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,更具体地说。能用吗?为什么这么慢还有别的原因吗?在