Python在列表队列上迭代-以较慢的速度删除重复项
客户端通过套接字发送数据。数据被解析,并放入列表中 这个很好用 有时它包含重复的数据,我想用这些数据替换旧数据,因此I.pop()将其取出并附加到新数据中 这个很好用。。。有一段时间 某个地方经济放缓了。我是根据相当一致的数据量来判断速度的。它从一开始就加速完成这一切,持续大约10分钟。在这段时间里,它必须不断清除旧的匹配项,并且列表大小一直保持不变 但是,当控制台在之前的数量中飞行时,它就变成了一堵相当缓慢的“消除重复”的墙 因为这需要更多的时间,所以添加到队列中的时间会变得越来越长,这将成为一个永无止境的循环,它无法跟上 当前代码片段:Python在列表队列上迭代-以较慢的速度删除重复项,python,list,python-2.7,sockets,queue,Python,List,Python 2.7,Sockets,Queue,客户端通过套接字发送数据。数据被解析,并放入列表中 这个很好用 有时它包含重复的数据,我想用这些数据替换旧数据,因此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的函数首先复制列表,因此它从队列写入的另一个列表开始工作
这已经改善了情况,但仍然比我预期的要慢。我将其简化为处理一个列表,这似乎加快了速度,同时修复了一些其他问题
我知道这看起来很奇怪,但我认为这是我能做到的最有效的方法。我把它简化为处理一个列表,这似乎加快了它的速度,同时修复了一些其他问题
我知道这看起来很奇怪,但我认为这是我能做到的最有效的方法。当我想避免重复时,我会想到设置。有什么理由不使用集合并将传入数据添加到集合中,这样就不必担心删除重复数据了?我以前没有真正看过集合,但看起来它不会满足我的需要。如果每个套接字的某些位与现有的匹配,我需要删除上一个套接字中的所有内容,并保留新套接字中的所有内容。它们看起来很方便,但不适合这种情况。我猜穿它不安全,因为我必须弹出零件…当我想避免重复时,我会想到设置。有什么理由不使用集合并将传入数据添加到集合中,这样就不必担心删除重复数据了?我以前没有真正看过集合,但看起来它不会满足我的需要。如果每个套接字的某些位与现有的匹配,我需要删除上一个套接字中的所有内容,并保留新套接字中的所有内容。它们看起来很方便,但不适合这个箱子。我猜穿这个不安全,因为我必须打开零件。。。