迭代3个大型列表来比较和赋值python

时间:2017-07-07 10:33:39

标签: python

我有一段代码,我需要通过许多列表来阅读和分配值

代码执行以下操作: 首先,对于实体(第一列表1300)中的每个元素,代码将读取其包含许多(第二列表5000)的文本文件,每行包含两个值。之后,代码将检查每行中的第一个值是否存在于 features 列表(3rdlist 17000)中,如果是,则会将行中的第二个值写入矩阵。 代码正在运行,但效率低且速度极慢。(超过12小时)

{{1}}

如果有人给我一个如何解决这个问题的想法,我将不胜感激

2 个答案:

答案 0 :(得分:1)

您在内循环中的要素查找速度很慢O(n)并且重复1300x5000 ~ 6.5M次。您要做的第一件事就是将features_list转换为dict并将查询速度提升到O(1)(消除第三个循环):

features = dict(zip(features_list, range(len(features_list)-1)))
for i in range(len(entities_list)-1):
    with open('/home/rana/'+entities_list[i]+'.txt', 'r') as fin:
        for line in fin:
             key, value = line.split()
             if key in features:
                 j = features[key]
                 co_occurrence_matrix[i,j] = float(value)

答案 1 :(得分:1)

您可以通过预先创建地图来完全优化第三个循环:

# first create a matrix map for fast features lookup
features_map = {feature: index for index, feature in enumerate(features_list)}
for index, entity in enumerate(entities_list):
    with open('/home/rana/{}.txt'.format(entity), 'r') as f:
        for line in f:
            feature, value = line.split()  # you might want to validate this, tho
            if feature in features_map:
                co_occurrence_matrix[index, features_map[feature]] = float(value)

如果文件特别大,可以通过在多个线程上委派I / O部件(加载文件)来进一步加快速度。