在Cython中优化Python字典查找
我试图提高Cython中这个函数的速度,因为它是一个算法的主要函数在Cython中优化Python字典查找,python,c++,c,dictionary,cython,Python,C++,C,Dictionary,Cython,我试图提高Cython中这个函数的速度,因为它是一个算法的主要函数 cpdef float _cost(list path, int lenth, dict time, dict cost): cdef: float final_cost = 0 float time_sum = 0 int count = 0, i=0, for i in range(lenth): p1 = path[i]
cpdef float _cost(list path, int lenth, dict time, dict cost):
cdef:
float final_cost = 0
float time_sum = 0
int count = 0, i=0,
for i in range(lenth):
p1 = path[i]
p2 = path[i+1]
if time_sum < 8:
time_sum += time[p1][p2]
final_cost += cost[p1][p2]
else:
time_sum = time[p1][path[0]] + time[path[0]][p2]
final_cost += cost[p1][path[0]] + cost[path[0]][p2]
count +=1
final_cost += cost[path[0]][path[lenth]]
return final_cost + count * 9.25 * 2
cpdef float\u成本(列表路径、整数长度、dict时间、dict成本):
cdef:
浮动最终成本=0
浮动时间总和=0
整数计数=0,i=0,
对于范围内的i(长度):
p1=路径[i]
p2=路径[i+1]
如果时间总和小于8:
时间总和=时间[p1][p2]
最终成本+=成本[p1][p2]
其他:
时间之和=时间[p1][路径[0]]+时间[路径[0]][p2]
最终成本+=成本[p1][路径[0]]+成本[路径[0]]][p2]
计数+=1
最终成本+=成本[路径[0][路径[lenth]]
返回最终成本+计数*9.25*2
这两个字典都由int
作为键和其他字典作为值组成,其中int
作为键和float
作为值。在C++中,键入是以下<代码>无序的映射代价;<代码>
- 我做的第一个优化是用C++编写的函数,使用<代码> unOrdEdEdMult,但是<强> Python哈希字典是闪耀的< < /强> >。所以代码稍微慢了一点
- 第二次优化确实提高了一点速度。正如您在代码中看到的,
和p1
变量没有被键入,这是因为如果我键入,Cython必须进行大量转换以使Cython int适应dict int类型(与int-Cython类型不同)p2
p1
和p2
类型?我想这会提高速度的李>
你不能相当快地加速Python的DIAT.上次我和C++的地图比较,C++无序映射稍微快一点查找(所以你可能做了一些错事)。谷歌还提供了稠密的散列映射,它甚至比c++的实现速度还要快。键入
p1
和p2
不太可能改善Python dict的任何功能,因为使用它们的唯一目的是查找dict
,这需要一个通用Python对象。您肯定已经尝试过明显的方法-也许这和您的算法一样快?使用无序图
-主要的事情是确保数据保持为无序图
。您不希望将它复制到Pythondict
,而不是嵌套的dict
中吗?这取决于数据的稀疏程度,但如果可行的话,速度可能会快得多?你根本不需要迭代。将path[i]
的时间和成本值放在time[path[i]
和time[cost[i]
上,就像您现在对dicts所做的那样。这里的折衷是,您必须分配两个长度为max(path[])的数组,这可能非常大。(考虑为此使用Ndarray或MemoryView。)