我有一段代码,我需要通过许多列表来阅读和分配值
代码执行以下操作: 首先,对于实体(第一列表1300)中的每个元素,代码将读取其包含许多行(第二列表5000)的文本文件,每行包含两个值。之后,代码将检查每行中的第一个值是否存在于 features 列表(3rdlist 17000)中,如果是,则会将行中的第二个值写入矩阵。 代码正在运行,但效率低且速度极慢。(超过12小时)
{{1}}
如果有人给我一个如何解决这个问题的想法,我将不胜感激
答案 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部件(加载文件)来进一步加快速度。