gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:31:59 25 4
gpt4 key购买 nike

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

最大机器人可以有 100 个软限制(如果可以更高,那就太好了)。

为此,我执行以下简化操作:

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

机器人是一个 1x2 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)

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

可以看出 taxicab_distance 被称为 alot,因为 agent 需要评估一个机器人的四个邻居和它自己到目标点的距离,以查看下一个位置是否仍然可以到达目标,并且最大化与所有其他机器人的距离作为优化启发式。

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

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

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

远程调用链:agent -> environment.distance -> taxicab_distance

问题是,如何减少调用函数的开销?我强烈考虑使用 pythons c 可扩展性、cython 来更具体。它会工作吗?它这么慢还有其他原因吗?

最佳答案

首先,我将其重写为:

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

你能同时计算多个机器人的 taxicab_distance 吗?

关于python - 减少python中的函数调用开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20869783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com