我想我以前把这个问题复杂化了。
将多个列表的内容写入 XML 文件。编写一个结果需要一毫秒,但 100 个结果几乎需要一分钟,这没有意义。我添加了一个计数器,每次写入都比上一次慢。
我找不到这方面的瓶颈。我不明白是什么减慢了它的速度,我离自己手动将数据写入记事本只有一丝之遥。
我试过:
*不检查 Temp.xml 存在以设置树/根,它没有区别。
*使用相同的列表而不是多个列表,以防万一导致奇怪的事情。
*我认为这可能只是我的系统,所以我把它放在 40 核疯狂级别的 SSD 服务器上,它有相同的结果。
代码:
def filewriter():
while 1:
time.sleep(10)
if OnlyOneXMLWriteCheck == 1:
WriteThatThread = Thread(target = FileWrite)
WriteThatThread.start()
WriteThatThread.join()
def FileWrite():
try:
if os.path.exists("Temp.xml") == True:
os.remove("Temp.xml")
EventDumpCounter = 0
for Eventes in EventTags:
try:
if os.path.exists("Temp.xml") == True:
tree = ET.parse("Temp.xml")
root = tree.getroot()
if os.path.exists("Temp.xml") == False:
root = ET.Element("Refunds")
tree = ET.ElementTree(root)
if float(EventCost[EventDumpCounter]) > float(Price[EventDumpCounter]):
if "Horse" in EventTags[EventDumpCounter]:
Eventes = ET.SubElement(root, "Event", type = EventTags[EventDumpCounter])
ET.SubElement(Eventes, "EventTime").text = str(EventTimes[EventDumpCounter])
ET.SubElement(Eventes, "EventName").text = str(EventName[EventDumpCounter])
ET.SubElement(Eventes, "EventLoc").text = str(EventLoc[EventDumpCounter])
ET.SubElement(Eventes, "EventSpace").text = str(EventSpace[EventDumpCounter])
ET.SubElement(Eventes, "EventCost").text = str(EventCost[EventDumpCounter])
ET.SubElement(Eventes, "EventPrice").text = str(EventPrice[EventDumpCounter])
ET.SubElement(Eventes, "EventParking").text = str(EventParking[EventDumpCounter])
ET.SubElement(Eventes, "EventDist").text = str(EventDist[EventDumpCounter])
tree.write("Temp.xml")
EventDumpCounter +=1
except:
print "Problem writing XML"
#except:
except WindowsError, e:
print "Problem creating XML 2"
#e = sys.exc_info()[0]
print e
KeepWritingFiles = Thread(target = filewriter)
KeepWritingFiles.start()
/更新:
在下面的评论之后,有人建议每次解析XML都会减慢速度。我这样做是为了它可以启动一个新的 XML 或附加到现有的 XML,但我改成了这个:
if os.path.exists("Temp.xml") == True:
if OnlyParseOnce == 0:
print "opening file"
OnlyParseOnce = 1
tree = ET.parse("Temp.xml")
root = tree.getroot()
if os.path.exists("Temp.xml") == False:
root = ET.Element("Events")
tree = ET.ElementTree(root)
"打开文件"只显示一次,这意味着它不会不断解析文件,而且速度仍然很慢。我想知道"os.path.exists"是否是瓶颈。
如果我手动设置它
root = ET.Element("Refunds")
tree = ET.ElementTree("Events")
它在一秒钟内飞过相同数量的数据。根本没有时间。但这样它就不会附加到现有文件中,而是不断重写。所以它可能是os.path.exist,或者只是因为我正在编写一个结果而不是创建一个更大的文件。
您的代码使用 tree.write("Temp.xml")
在每个循环结束时写入文档,然后使用 tree = ET.parse("Temp.xml")
再次读取和分析它。这是完全没有意义的,因为tree
已经在内存中,不需要重建。随着文档的增长,写入和读取的成本上升,性能下降。只需使用内存中的 tree
对象并延迟写入,直到循环完成。
def FileWrite():
try:
if os.path.exists("Temp.xml") == True:
os.remove("Temp.xml")
root = ET.Element("Refunds")
tree = ET.ElementTree(root)
EventDumpCounter = 0
for Eventes in EventTags:
try:
if float(EventCost[EventDumpCounter]) > float(Price[EventDumpCounter]):
if "Horse" in EventTags[EventDumpCounter]:
Eventes = ET.SubElement(root, "Event", type = EventTags[EventDumpCounter])
ET.SubElement(Eventes, "EventTime").text = str(EventTimes[EventDumpCounter])
ET.SubElement(Eventes, "EventName").text = str(EventName[EventDumpCounter])
ET.SubElement(Eventes, "EventLoc").text = str(EventLoc[EventDumpCounter])
ET.SubElement(Eventes, "EventSpace").text = str(EventSpace[EventDumpCounter])
ET.SubElement(Eventes, "EventCost").text = str(EventCost[EventDumpCounter])
ET.SubElement(Eventes, "EventPrice").text = str(EventPrice[EventDumpCounter])
ET.SubElement(Eventes, "EventParking").text = str(EventParking[EventDumpCounter])
ET.SubElement(Eventes, "EventDist").text = str(EventDist[EventDumpCounter])
EventDumpCounter +=1
except: # bad idea, you just supressed debug info
# potential problem = since you supress the error and continue
# processing but EventDumpCounter never advanced, you could
# get stuck in an infinite error loop.
print "Problem writing XML"
tree.write("Temp.xml")
#except:
except WindowsError, e:
print "Problem creating XML 2"
#e = sys.exc_info()[0]
print e