迭代和随着时间的推移

时间:2016-02-24 20:21:41

标签: python python-2.7 python-3.x

我有一个按行显示的文件文本,以及两个包含从文件文本中提取的项目的列表。任务是创建两个列表中项目的dict,它们出现在文件文本的同一行中。这是代码

list1 = [items] ### about 114,5 kB
list2 = [items] ### about 115,5 kB
file_text = file text splitted by lines ### about 190,5 kB


dict_one =  defaultdict(set)
for line in file_text:
    for x in list1:
        for xx in list2:
            if x in line and xx in line:
                dict_one[x].add(xx)   
print (dict_one.items())

我的问题是迭代的时间。有人可以用更少的时间进行迭代来建议另一种方式。感谢

2 个答案:

答案 0 :(得分:0)

目前,您正在list2一次又一次地检查list1中的所有项目,但line中的值是否与list1中的当前值无关line 1}}在list2中。通过简单地重新排列循环并重新使用来自list1的每个匹配的for line in file_text: x_in_line = [x for x in list1 if x in line] if x_in_line: y_in_line = [y for y in list2 if y in line] for x in x_in_line: dict_one[x].update(y_in_line) 匹配,这应该会快得多。

file

如果has _n_ items, text _k_ items, and list1 line_as_set = set(line.split()) x_in_line = [x for x in list1 if x in line_as_set] list2` j 项,那么您的算法将具有O的复杂度(n k j),而这个应该只有O(n(k + j))。

另一个优化可能是拆分该行并将其转换为一组单词,但根据您的数据,这可能会或可能不起作用。

list1

或者,由于您从list2中提取了file_textlist1中的项目,因此您可以使用与从文件中提取字词相同的函数并应用它只是当前行,而根本没有使用list2for line in file_text: x_in_line = extract_values_1(line) if x_in_line: y_in_line = extract_values_2(line) for x in x_in_line: dict_one[x].update(y_in_line)

list1

如果文件有很多短行,那么这可能比检查list2ast.literal_eval中的所有单词更快,只是为了找到在该特定行中出现的极少数。

答案 1 :(得分:0)

multiprocessing可以为您提供NUMBER_OF_CORES次加速

示例代码的一部分......

namespace Vlc
{
    public class Controller
    {
       // Rest of code..
    }
}