![](/img/trans.png)
[英]Python function call vs database query (django ORM) overhead
[英]Reducing function call overhead in python
我開發了一個應用程序,它模擬在網格中移動的N個機器人,這些機器人試圖在有限的步驟中最大化訪問的網格單元的數量,在目標點進行會議。 這一切都正常,但是很慢。 它目前是python + numpy + mathplotlib。
那里的最大機器人可以有100的軟限制(如果它可以變得更高,那么它很好)。
為此,我做了以下簡化:
while steps > 0:
for robot in robots:
agent.calc(robot,steps)
機器人是1x2 numpy數組(x和y坐標)。
這里的代理人決定做什么。 由於我需要動態切換策略和策略,我無法改變這種邏輯。
agent.calc一個接一個地更新機器人。
cProfiling它返回以下內容 。 提取頂部
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
嗎?
我用內聯對它進行了基准測試,它起飛了〜15秒。 最后,我重寫了C ++中的數字運算並使用cython進行集成。 之后,只花了1秒鍾。
編輯:cpython - > cython
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.