Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
如何使python的功能更快?_Python_Performance - Fatal编程技术网

如何使python的功能更快?

如何使python的功能更快?,python,performance,Python,Performance,我编写的以下代码获取了一组68000个项目,并尝试根据字符串中的文本位置查找类似的项目。这个过程需要在我暂时用来编码的i3 4130上花费一点时间-有什么方法可以加速这个过程吗?我正在制作一种类型的“你的意思是什么?”函数,所以我需要根据用户输入的内容进行排序 我并不是在已经使用关键字创建的字典中通过相似性进行比较,我是在尝试比较用户动态输入和所有现有关键字之间的相似性。用户可能会键入错误的密钥,这就是为什么它会像谷歌搜索一样说“你是什么意思?” 根据平均测试,排序不会影响时间 def simi

我编写的以下代码获取了一组68000个项目,并尝试根据字符串中的文本位置查找类似的项目。这个过程需要在我暂时用来编码的i3 4130上花费一点时间-有什么方法可以加速这个过程吗?我正在制作一种类型的“你的意思是什么?”函数,所以我需要根据用户输入的内容进行排序

我并不是在已经使用关键字创建的字典中通过相似性进行比较,我是在尝试比较用户动态输入和所有现有关键字之间的相似性。用户可能会键入错误的密钥,这就是为什么它会像谷歌搜索一样说“你是什么意思?”

根据平均测试,排序不会影响时间

def similar_movies(movie):
    start=time.clock()
    movie=capitalize(movie)
    similarmovies={}
    allmovies=all_movies() #returns set of all 68000 movies
    for item in allmovies:
        '''if similar(movie.lower(),item.lower())>.5 or movie in item: #older algorithm
            similarmovies[item]=similar(movie.lower(),item.lower())'''
        if movie in item: #newer algorithm,
                similarmovies[item]=1.0
                print item
        else:
            similarmovies[item]=similar(movie.lower(),item.lower())
    similarmovieshigh=sorted(similarmovies, key=similarmovies.get, reverse=True)[:10]
    print time.clock()-start
    return similarmovieshigh
使用的其他功能:

from difflib import SequenceMatcher
def similar(a, b):
    output=SequenceMatcher(None, a, b).ratio()
    return output

def all_movies(): #returns set of all keys in sub dicts(movies)
    people=list(ratings.keys())
    allmovies=[]
    for item in people:
        for i in ratings[item]:
            allmovies.append(i)
    allmovies=set(allmovies)
    return allmovies
字典采用这种格式,但有数千个名称除外:


ratings={'Shane':{'Avatar':4.2,'127小时:'4.7},'Joe':{'Into The Wild':4.5,'Unstopped':3.0}

您的算法将是ON 2,因为在每个标题中,in操作符必须检查标题的每个子字符串,以确定输入的文本是否在其中。所以,是的,我能理解你为什么希望它跑得更快

i3没有提供太多的计算能力,因此尽可能多的预计算是唯一的解决方案,而运行额外的软件(如数据库)可能会提供很差的结果,这也是由于它的能力

你可以考虑使用一个标题词字典,它可能有预先计算的语音变化来消除最常见的拼写错误。Porter Stemmer算法应该提供一些有用的简化规则,例如允许不停止匹配不可停止的。 例如,字典中的一个键是wild或语音调整,与该键关联的值是包含wild的所有标题的列表;在你68000个标题的列表中,你会有相同的名称,如:进入、化身、小时、127以及所有其他单词。举个例子,您的字典的通配符可能如下所示:

"wild": ["Into The Wild", "Wild Wild West", "Wild Things"]
是的,我在IMDB上搜索wild只是为了让这个列表有更多的条目-可能不是最好的选择,但是没有多少标题包含avatar、Unstopped或hours

常见单词(如)可能有足够的条目,您可能希望排除它们,因此词典的持久副本可能有助于您进行特定调整,尽管这不是必需的,并且启动时计算时间应该相对较快

当用户键入某些文本时,您可以将文本拆分为单词,如果您选择使用它们,则应用任何语音缩减,然后连接用户所有单词的所有标题列表,包括重复项

然后,计算重复项并按标题匹配的次数排序。如果用户键入了Wild,则在Wild和Wild中会有两个匹配项,因此它的排序应该高于标题中仅包含或Wild的排序,而不包含两者

在构建最终排序列表后,可以搜索您的评分列表,并将评分附加到每个条目中;这个操作应该很快,因为您的评级已经在字典中,由名称键入

这会将On2搜索变成对输入的每个单词的Ologn搜索,如果符合您的需要,这将在性能上产生很大的差异。

在所有电影中:您可以添加到集合而不是列表中,而不是添加到列表中:

def all_movies():
    allmovies = set()
    for item in ratings.keys():
        for i in ratings[item]:
            allmovies.add(i)
    return allmovies
编辑:或仅使用一个for循环:

def all_movies():
    result = []
    for rating_dict in ratings.values()
        result += rating_dict.keys()
    return result
我在类似的电影中看不到任何东西

还可以看看芹菜:对于多加工,
特别是块的概念:

如果你是为生产系统开发的,我建议使用全文搜索引擎,比如,或。全文搜索引擎是一个服务器,它构建索引以有效地实现全文搜索,包括模糊搜索或邻近搜索。许多流行的数据库系统还具有类似全文搜索引擎的功能,如果您已经在使用这些数据库引擎,这可能是一个可接受的替代方案


如果此代码主要是为自学习而开发的,并且您希望了解如何实现模糊搜索,那么您可能希望查看索引和搜索词中电影标题的规范化。有一些方法,比如and,可以根据搜索词在英语中的发音来规范化搜索词,这个规范化的词可以用来创建搜索索引。PostgreSQL有。请注意,这些算法是非常基本的构建块,一个合适的全文搜索引擎将考虑拼写错误、同义词、停止词、特定语言的怪癖,以及并行/分布式处理等优化。

排序通常需要对数n的完成时间。你绝对确定你需要对最终结果进行排序吗?我看不出你的代码有任何非常低效的地方。。。现在可能是开始使用数据库的时候了。如果您开始将电影存储在某种类型的btree中,那么您可能可以在类似的电影中摆脱排序调用
当你插入它们时,它们是被分类的。@AkshatMahajan嗯,有点;它将最低级别的类似电影按最高级别进行排序。你不希望一部没有相似之处的电影出现在最上面。这有点像“你是什么意思?”之类的东西。@TrivisionZero和Matt的回答表明,你的算法远远不够高效。他提出的建议并不简单,特别是如果你是一名初学者,但这些建议将使你的暴力方法成为一个优雅的解决方案。@msw我理解Matt试图提出的建议,但这不是用户输入的方式,至少不是我的想法。我试图在用户错误输入电影标题的情况下进行规划,这就是为什么我比较字符串的相似性,而不是通过关键字。如果输入是th3-wild,则不会出现任何结果。th3-wild将导致匹配的wild而不是,因此是的,会出现一些结果;那么,您的新算法是临时的吗?您计划返回SequenceMatcher实现吗?事实上,我正在寻找不同的方法来添加到列表中,似乎:allmovies+=I是最快的。您的代码持续使用了2.25秒,+=i平均使用了1.3秒。有没有什么办法能让这一进程更快?也许去掉第二个for循环,每次只添加整个列表?@TrivisionZero:我根据您的评论添加了另一个aproach。问题中提到的格式实际上是ratings[rating_list]。值,因为它实际上充满了子部分。即使出于某种原因,纠正这一点也同样缓慢或缓慢。@TrivisionZero:我将其更改为期望一个口述的口述,这至少应该起作用,对于您问题中的示例: