Python在列表队列上迭代-以较慢的速度删除重复项

Python在列表队列上迭代-以较慢的速度删除重复项,python,list,python-2.7,sockets,queue,Python,List,Python 2.7,Sockets,Queue,客户端通过套接字发送数据。数据被解析,并放入列表中 这个很好用 有时它包含重复的数据,我想用这些数据替换旧数据,因此I.pop()将其取出并附加到新数据中 这个很好用。。。有一段时间 某个地方经济放缓了。我是根据相当一致的数据量来判断速度的。它从一开始就加速完成这一切,持续大约10分钟。在这段时间里,它必须不断清除旧的匹配项,并且列表大小一直保持不变 但是,当控制台在之前的数量中飞行时,它就变成了一堵相当缓慢的“消除重复”的墙 因为这需要更多的时间,所以添加到队列中的时间会变得越来越长,这将成为

客户端通过套接字发送数据。数据被解析,并放入列表中

这个很好用

有时它包含重复的数据,我想用这些数据替换旧数据,因此I.pop()将其取出并附加到新数据中

这个很好用。。。有一段时间

某个地方经济放缓了。我是根据相当一致的数据量来判断速度的。它从一开始就加速完成这一切,持续大约10分钟。在这段时间里,它必须不断清除旧的匹配项,并且列表大小一直保持不变

但是,当控制台在之前的数量中飞行时,它就变成了一堵相当缓慢的“消除重复”的墙

因为这需要更多的时间,所以添加到队列中的时间会变得越来越长,这将成为一个永无止境的循环,它无法跟上

当前代码片段:

def QDUmp(): #Runs as a thread
    while 1:
        while not q.empty():

            print q.get()

            XMLdataparse = []
            del XMLdataparse[:]
            XMLdataparse[:] = []
            XMLdataparse = q.get().split('--ListBreaker--')

            if len(XMLdataparse) == 20:

                if "EventText" in XMLdataparse[0]:
                    TheCounter = len(EventTags)-1
                    for Events in reversed(EventTags):
                        try:
                            EventN = EventNames[TheCounter]
                            PlaceN = PlaceNames[TheCounter]
                            TypeN =  BetHorsessToMake[TheCounter]
                            OldTag = EventTags[TheCounter]

                            if EventN == str(XMLdataparse[2]) and PlaceN == str(XMLdataparse[3]) and TypeN == str(XMLdataparse[4]):
                                print "removing dupe: ",TypeN
                                EventTags.pop(TheCounter)
                                EventTimes.pop(TheCounter)
                                EventNames.pop(TheCounter)
                                PlaceNames.pop(TheCounter)

                            TheCounter = TheCounter - 1
                        except:
                            print "problem removing a duplicate result"

                if float(XMLdataparse[6]) > float(XMLdataparse[18]):
                    EventTags.append(XMLdataparse[0])
                    EventTimes.append(XMLdataparse[1])
                    EventNames.append(XMLdataparse[2])
                    PlaceNames.append(XMLdataparse[3])


class ThreadedServer(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))

    def listen(self):
        self.sock.listen(5)
        while True:
            client, address = self.sock.accept()
            client.settimeout(60)
            threading.Thread(target = self.listenToClient,args = (client,address)).start()

    def listenToClient(self, client, address):
        size = 1024
        while True:
            try:
                data = client.recv(size)
                if data:
                    try:
                        BigSocketParse = []
                        del BigSocketParse[:]
                        BigSocketParse[:] = []
                        BigSocketParse = data.split('--MarkNew--')

                        print "Putting data in queue"
                        for eachmatch in BigSocketParse:
                            q.put(str(eachmatch))

                    except:
                        print "Unable to parse socket text."

                    #q.put(data)
                    #QCheck.start()
                else:
                    raise error('Client disconnected')
            except:
                client.close()


CheckQ = Thread(target = QDUmp)
CheckQ.start()

ThreadedServer('',1234).listen() 
数据通过一个更大的套接字发送进来,使用--MarkNew--作为分隔符,然后我用--listbarker--将其分解为列表部分。也许这不是最有效的方法,但套接字的大小基本相同,所以我处理列表的方式必须是减速

首先,我认为它不是很有效,因为它必须遍历整个列表。但我不知道还有什么办法可以消除重复的

任何关于这方面的建议都将不胜感激

更新:

我找到了一种方法,让它处理十几个两个条目而不是几百个条目,并比较传入的整个套接字数据,而不是每个单独的部分,但不幸的是,这无法完成任务。我必须能够保留单个零件,如果它们是新的,并删除重复的。我想不出一个不必这么做的方法

正在考虑多线程技术。它可能会占用资源,但至少不会让所有的事情都停顿下来,但我开始使用队列的全部原因是不让多个线程同时读写这些列表

更新#2:

等一下

异常处理程序不移动计数器,这意味着它不会正确地移动,尽管如果它正在抛出异常,它将抛出整个事件。这也许可以解释当它开始减速时出现的一个或两个其他错误

只需使用一个列表就可以稍微修改一下

我可以将其更改为一个列表而不是几个列表,或者只比较一个条目而不是三个条目,但我发现很难相信这可能是经济放缓的原因

更新#3:

将其从一个列表中简化为弹出。现在,将数据写入XML的函数首先复制列表,因此它从队列写入的另一个列表开始工作


这已经改善了情况,但仍然比我预期的要慢。

我将其简化为处理一个列表,这似乎加快了速度,同时修复了一些其他问题


我知道这看起来很奇怪,但我认为这是我能做到的最有效的方法。

我把它简化为处理一个列表,这似乎加快了它的速度,同时修复了一些其他问题


我知道这看起来很奇怪,但我认为这是我能做到的最有效的方法。

当我想避免重复时,我会想到设置。有什么理由不使用集合并将传入数据添加到集合中,这样就不必担心删除重复数据了?我以前没有真正看过集合,但看起来它不会满足我的需要。如果每个套接字的某些位与现有的匹配,我需要删除上一个套接字中的所有内容,并保留新套接字中的所有内容。它们看起来很方便,但不适合这种情况。我猜穿它不安全,因为我必须弹出零件…当我想避免重复时,我会想到设置。有什么理由不使用集合并将传入数据添加到集合中,这样就不必担心删除重复数据了?我以前没有真正看过集合,但看起来它不会满足我的需要。如果每个套接字的某些位与现有的匹配,我需要删除上一个套接字中的所有内容,并保留新套接字中的所有内容。它们看起来很方便,但不适合这个箱子。我猜穿这个不安全,因为我必须打开零件。。。