Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cython中优化Python字典查找_Python_C++_C_Dictionary_Cython - Fatal编程技术网

在Cython中优化Python字典查找

在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]

我试图提高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]
        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
    p2
    变量没有被键入,这是因为如果我键入,Cython必须进行大量转换以使Cython int适应dict int类型(与int-Cython类型不同)
在花了大量时间研究如何改进后,我无法解决这两个问题:

  • 是否有正确的
    p1
    p2
    类型?我想这会提高速度的
  • 有什么方法可以改进这个功能吗?也许我错过了什么

  • 你不能相当快地加速Python的DIAT.上次我和C++的地图比较,C++无序映射稍微快一点查找(所以你可能做了一些错事)。谷歌还提供了稠密的散列映射,它甚至比c++的实现速度还要快。键入
    p1
    p2
    不太可能改善Python dict的任何功能,因为使用它们的唯一目的是查找
    dict
    ,这需要一个通用Python对象。您肯定已经尝试过明显的方法-也许这和您的算法一样快?使用
    无序图
    -主要的事情是确保数据保持为
    无序图
    。您不希望将它复制到Python
    dict
    ,而不是嵌套的
    dict
    中吗?这取决于数据的稀疏程度,但如果可行的话,速度可能会快得多?你根本不需要迭代。将
    path[i]
    的时间和成本值放在
    time[path[i]
    time[cost[i]
    上,就像您现在对dicts所做的那样。这里的折衷是,您必须分配两个长度为max(path[])的数组,这可能非常大。(考虑为此使用Ndarray或MemoryView。)