难!将列表合成传输到功能时出现意外的速度降低

时间:2016-06-26 15:17:45

标签: python performance search

我写了一个代码,它应该对文件的句子和两个列表的元素 - keywordskeywords2进行一些操作。它如下 -

import os
keywords=['a','b']
keywords2=['c','d mvb']

def foo(sentence,k2):

    gs_list=[]                       #####
    for k in keywords:               #####    
        if k in sentence:            #####
            gs_list.append(k)        #####

    for k in gs_list:
        if (k in sentence) and (k2 in sentence):
            print 'a match'
    return 4

for path, dirs, files in os.walk(r'F:\M.Tech\for assigning cl\selected\random 100'):
    for file in files:
        sentences=open(file).readlines();
        for sentence in sentences:
            if sentence.startswith('!series_title'):      
                for k2 in keywords2:
                    foo(sentence,k2)

我已经标记了有问题的代码部分。这件作品(我们称之为BETA)基本上形成了一个关键词列表,其中 在所选的句子中。因此,必须仅使用这些关键字来执行将来的操作。

此代码大约需要47 seconds才能运行100个文件。现在我试图想办法加快速度。 keywords2中有大约50个元素。所以我认为我基本上在函数func内运行BETA 50次,而我需要的只是列表keywordssentence。我在主代码中已经有了这两个,所以我将这部分转移到了代码的主要部分 -

import os
keywords=['a','b']
keywords2=['c','d mvb']

def foo(sentence,k2):

    for k in gs_list:
        if (k in sentence) and (k2 in sentence):
            print 'a match'
    return 4

for path, dirs, files in os.walk(r'F:\M.Tech\for assigning cl\selected\random 100'):
    for file in files:
        sentences=open(file).readlines();
        for sentence in sentences:
            if sentence.startswith('!series_title'):   

                gs_list=[]                       #####
                for k in keywords:               #####    
                    if k in sentence:            #####
                        gs_list.append(k)        #####                        

                for k2 in keywords2:
                    foo(sentence,k2)

我的想法是,这将确保这个列表形成过程仅针对每个句子发生一次,而不是像以前那样发生50次。这肯定会提高代码的速度。但是这段代码实际上花了89 seconds来浏览相同的100个文件。

我无法理解为什么这比以前的代码花费更多时间。有什么想法吗?

0 个答案:

没有答案