如何实现字典;使用Python元组;作为C+中的键+;? 我现在有一些Python代码,我想把它移植到C++,因为它现在比我希望的慢。问题是我在其中使用了一个字典,其中的键是一个元组,由一个对象和一个字符串组成(例如(obj,“word”))我在C++中如何编写类似的东西?< /强>也许我的算法是可怕的,有办法可以使它更快,而不诉诸C++()

如何实现字典;使用Python元组;作为C+中的键+;? 我现在有一些Python代码,我想把它移植到C++,因为它现在比我希望的慢。问题是我在其中使用了一个字典,其中的键是一个元组,由一个对象和一个字符串组成(例如(obj,“word”))我在C++中如何编写类似的东西?< /强>也许我的算法是可怕的,有办法可以使它更快,而不诉诸C++(),c++,python,dictionary,C++,Python,Dictionary,为了清晰起见,整个算法如下所示。词典“post_score”是一个问题 def get_best_match_best(search_text, posts): """ Find the best matches between a search query "search_text" and any of the strings in "posts". @param search_text: Query to find an appropriate match

为了清晰起见,整个算法如下所示。词典“post_score”是一个问题

def get_best_match_best(search_text, posts):
    """
    Find the best matches between a search query "search_text" and any of the
    strings in "posts".

    @param search_text: Query to find an appropriate match with in posts.
    @type search_text: string
    @param posts: List of candidates to match with target text.
    @type posts: [cl_post.Post]
    @return: Best matches of the candidates found in posts. The posts are ordered
    according to their rank. First post in list has best match and so on.
    @returntype: [cl_post.Post]
    """
    from math import log

    search_words = separate_words(search_text)
    total_number_of_hits = {}
    post_score = {}
    post_size = {}
    for search_word in search_words:
        total_number_of_hits[search_word] = 0.0
        for post in posts:
            post_score[(post, search_word)] = 0.0
            post_words = separate_words(post.text)
            post_size[post] = len(post_words)
            for post_word in post_words:
                possible_match = abs(len(post_word) - len(search_word)) <= 2
                if possible_match:
                    score = calculate_score(search_word, post_word)
                    post_score[(post, search_word)] += score
                    if score >= 1.0:
                        total_number_of_hits[search_word] += 1.0

    log_of_number_of_posts = log(len(posts))
    matches = []
    for post in posts:
       rank = 0.0
       for search_word in search_words:
           rank += post_score[(post, search_word)] * \
                  (log_of_number_of_posts - log(1.0 + total_number_of_hits[search_word]))
       matches.append((rank / post_size[post], post))
    matches.sort(reverse=True)
    return [post[1] for post in matches]
def get_best_match_best(搜索文本、帖子):
"""
查找搜索查询“search_text”与以下任何一项之间的最佳匹配
“posts”中的字符串。
@param search_text:查询以在帖子中查找与的适当匹配项。
@键入搜索\u文本:字符串
@param posts:与目标文本匹配的候选列表。
@类型柱:[cl_柱.柱]
@return:在帖子中找到的候选人的最佳匹配。帖子是有序的
根据他们的排名。名单中的第一个职位有最好的匹配,以此类推。
@返回类型:[cl_post.post]
"""
从数学导入日志
搜索词=单独的词(搜索文本)
总点击次数={}
post_得分={}
post_大小={}
对于搜索词中的搜索词:
总点击次数[搜索词]=0.0
在职人员:
帖子得分[(帖子、搜索词)]=0.0
post\u单词=单独的单词(post.text)
贴子大小[贴子]=长度(贴子字)
对于post_单词中的post_单词:
可能匹配=abs(len(post_-word)-len(search_-word))=1.0:
点击总数[搜索词]+=1.0
日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志日志
匹配项=[]
在职人员:
秩=0.0
对于搜索词中的搜索词:
排名+=职位分数[(职位、搜索词)]*\
(日志文章数量日志-日志(1.0+总点击次数[搜索词])
匹配。追加((排名/职位大小[职位],职位))
matches.sort(reverse=True)
return[post[1]用于匹配中的post]

<>代码>地图>代码>如果你对C++使用了这个词,

代码> map < /C> >如果你对C++使用了这个词。

一次,你在搜索词中调用每个搜索词的分隔词(POST。text)。在
posts
中,每个
post
只能调用一次单独的单词

也就是说,而不是:

for search_word in search_words:
    for post in posts:
        # do heavy work
你应该:

for post in posts:
    # do the heavy works
    for search_word in search_words:
        ...
如果,正如我所怀疑的那样,单独的_字做了大量的字符串操作,那么不要忘记,在python中,字符串操作相对昂贵,因为字符串是不可变的

您可以做的另一个改进是,您不必将搜索词中的每个词与post词中的每个词进行比较。如果按字长对search_单词和post_单词数组进行排序,则可以使用滑动窗口技术。基本上,由于搜索词的长度差异小于2时,搜索词将仅与帖子词匹配,因此您只需在两个长度差异窗口中进行检查,从而减少要检查的词数,例如:

search_words = sorted(search_words, key=len)
g_post_words = collections.defaultdict(list) # this can probably use list of list
for post_word in post_words:
    g_post_words[len(post_word)].append(post_word)

for search_word in search_words:
    l = len(search_word)
    # candidates = itertools.chain.from_iterable(g_post_words.get(m, []) for m in range(l - 2, l + 3))
    candidates = itertools.chain(g_post_words.get(l - 2, []), 
                                 g_post_words.get(l - 1, []), 
                                 g_post_words.get(l    , []),
                                 g_post_words.get(l + 1, []),
                                 g_post_words.get(l + 2, [])
                                )
    for post_word in candidates:
        score = calculate_score(search_word, post_word)
        # ... and the rest ...

(这段代码可能无法正常工作,只是为了说明这个想法)

这一次,您为搜索词中的每个搜索词调用了单独的词(post.text)。在
posts
中,每个
post
只能调用一次单独的单词

也就是说,而不是:

for search_word in search_words:
    for post in posts:
        # do heavy work
你应该:

for post in posts:
    # do the heavy works
    for search_word in search_words:
        ...
如果,正如我所怀疑的那样,单独的_字做了大量的字符串操作,那么不要忘记,在python中,字符串操作相对昂贵,因为字符串是不可变的

您可以做的另一个改进是,您不必将搜索词中的每个词与post词中的每个词进行比较。如果按字长对search_单词和post_单词数组进行排序,则可以使用滑动窗口技术。基本上,由于搜索词的长度差异小于2时,搜索词将仅与帖子词匹配,因此您只需在两个长度差异窗口中进行检查,从而减少要检查的词数,例如:

search_words = sorted(search_words, key=len)
g_post_words = collections.defaultdict(list) # this can probably use list of list
for post_word in post_words:
    g_post_words[len(post_word)].append(post_word)

for search_word in search_words:
    l = len(search_word)
    # candidates = itertools.chain.from_iterable(g_post_words.get(m, []) for m in range(l - 2, l + 3))
    candidates = itertools.chain(g_post_words.get(l - 2, []), 
                                 g_post_words.get(l - 1, []), 
                                 g_post_words.get(l    , []),
                                 g_post_words.get(l + 1, []),
                                 g_post_words.get(l + 2, [])
                                )
    for post_word in candidates:
        score = calculate_score(search_word, post_word)
        # ... and the rest ...

(这段代码可能无法正常工作,只是为了说明这个想法)

说真的,伙计,如果代码已经没有bug了,为什么不利用现有的工具呢?你看,乔·波尔斯基不建议重写。@Hamish Grubijan:乔·波尔斯基是谁,我为什么要在意他推荐的内容?@sbk你应该在意,因为他的话就是法律。@Ignacio Vazquez Abrams:不,但我会调查的。谢谢。:)@哈米什·格鲁比扬:“利用现有工具”是什么意思?@MdaG,我的意思是
Cython
,还有其他我听说过但忘记名字的工具。说真的,伙计,如果代码已经没有bug了,为什么不利用现有工具呢?你看,乔·波尔斯基不建议重写。@Hamish Grubijan:乔·波尔斯基是谁,我为什么要在意他推荐的内容?@sbk你应该在意,因为他的话就是法律。@Ignacio Vazquez Abrams:不,但我会调查的。谢谢。:)@哈米什·格鲁比扬:“利用现有工具”是什么意思?@MdaG,我的意思是
Cython
,还有其他我听说过但忘了名字的工具。如果MdaG真的是地狱之王,我想他会使用caps-lock。谢谢,我缺少的是这对工具。:-)如果我能使用Cython或更好的算法,我就不是地狱般的恶魔如果MdaG真的是地狱般的人,我想他会使用caps lock。谢谢,我缺少的就是这一对。:-)如果我能使用Cython或更好的算法,我就不是地狱般的恶魔这是有价值的输入,你是正确的。我不熟悉itertools,但现在是阅读它的好时机。谢谢。:)这是有价值的输入,你是正确的。我不熟悉itertools,但现在是阅读它的好时机。谢谢。:)