在Python中优化列表中的列表迭代

我有一个优化问题(我对Python和Stackoverflow有点新鲜)。

我正在为一个研究项目建立一个词语搭配网络。 我所写的代码需要一个没有停用词的词干文本(text_c)并将其分解成句子。 对于每个句子,它都会对术语进行迭代,以建立一个加权的语义网络,然后我将使用NetworkX进行处理。 这部分基于{'word':digit}形式的字典(下面的词典)。 代码遍历网络中现有边缘的列表(表示为3个项目的列表)。

问题可能是网络上的回路如何呈指数级增长(每次添加一个新的边/列表时,回路的尺寸都会增加)。 文中有大约110K个句子,所以这段时间太长了(最后花了4个小时跑完,没有完成)。 必须有更好的方式来做到这一点。 'for'语句会比外观更有效率吗? 这将如何工作?

谢谢!

#determine semantic networks    
outfile = open("00_network_"+str(c)+".csv","a")
network = []
er=0
data = text_c.split(".")
for lines in data:
    linew = lines.split()
    ran = len(linew)
    if ran>3: #sentences of more than three words
        i=0
        while i < ran:
            j = i+1
            while j < ran:
                try:
                    previous_edge = []
                    for n in network:
                        if n[0] == dic[linew[i]] and n[1] == dic[linew[j]]:
                            previous_edge = [n[0],n[1],n[2]]

                    if previous_edge == []:
                        new_edge = [dic[linew[i]],dic[linew[j]],1/((j-i))]
                        network.append(new_edge)
                    else:
                        new_edge = [dic[linew[i]],dic[linew[j]],previous_edge[2]+1/((j-i))]
                        network.remove([previous_edge[0],previous_edge[1],previous_edge[2]])
                        network.append(new_edge)
                except KeyError:
                    er=er+1

                j=j+1
            i=i+1

ij不在循环内部操作。

  • forrange
  • 在一个循环内比较dic[linew[i]]dic[linex[j]] ,并且每次都dic[linew[i]]值。

  • 缓存循环外的值
  • 当您找到previous_edge ,您可能需要break ,从而避免(许多)不必要的迭代

    不要针对空白列表进行测试。 not thislist这个列表就足以知道列表是否有东西。

    不要使用其3个值重新创建previous_edge以将其从网络中删除

    # determine semantic networks
    outfile = open("00_network_" + str(c) + ".csv", "a")
    network = []
    er = 0
    data = text_c.split(".")
    for lines in data:
        linew = lines.split()
        ran = len(linew)
        if ran > 3:  # sentences of more than three words
            # use for and ranges
            for i in range(ran):
                dli = dic[linew[i]]
                for j in range(ran):
                    try:
                        previous_edge = []
                        # cache dictionary access before going into for n loop
                        dlj = dic[linew[j]]
                        for n in network:
                            if n[0] == dli and n[1] == dlj:
                                previous_edge = [n[0], n[1], n[2]]
                                # DON'T YOU WANT A BREAK HERE?
                                break
    
                        if not previous_edge:  # negative test is enough
                            new_edge = [dli, dlj, 1/(j-i)]
                            network.append(new_edge)
                        else:
                            new_edge = [dli, dlj, previous_edge[2] + 1/(j-i)]
                            # DON'T RECREATE a LIST to remove the edge
                            network.remove(previous_edge)
                            network.append(new_edge)
                    except KeyError:
                        er = er + 1
    
    链接地址: http://www.djcxy.com/p/39625.html

    上一篇: Optimizing iteration of list in list on python

    下一篇: Which is faster in Python: x**.5 or math.sqrt(x)?