我有一个按行显示的文件文本,以及两个包含从文件文本中提取的项目的列表。任务是创建两个列表中项目的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())
我的问题是迭代的时间。有人可以用更少的时间进行迭代来建议另一种方式。感谢
答案 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_text
和list1
中的项目,因此您可以使用与从文件中提取字词相同的函数并应用它只是当前行,而根本没有使用list2
和for 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
如果文件有很多短行,那么这可能比检查list2
和ast.literal_eval
中的所有单词更快,只是为了找到在该特定行中出现的极少数。
答案 1 :(得分:0)
multiprocessing可以为您提供NUMBER_OF_CORES次加速
示例代码的一部分......
namespace Vlc
{
public class Controller
{
// Rest of code..
}
}