这很有效,但很慢。
我已经编写了一个自定义.py来将.gpx转换为.kml。它的工作方式就像我需要但速度太快了:对于477k的小.gpx,它正在写一个207k .kml文件,需要198秒才能完成!这太荒谬了,我还没有达到一个多肉的.gpx尺寸。
我的预感是,stringIO.stringIO(x)
是如此之慢。有任何想法如何加快它?
感谢您的期待。
以下是关键剪辑:
f = open(fileName, "r")
x = f.read()
x = re.sub(r'\n', '', x, re.S) #remove any newline returns
name = re.search('<name>(.*)</name>', x, re.S)
print "Attachment name (as recorded from GPS device): " + name.group(1)
x = re.sub(r'<(.*)<trkseg>', '', x, re.S) #strip header
x = x.replace("</trkseg></trk></gpx>",""); #strip footer
x = x.replace("<trkpt","\n<trkpt"); #make the file in lines
x = re.sub(r'<speed>(.*?)</speed>', '', x, re.S) #strip speed
x = re.sub(r'<extensions>(.*?)</extensions>', '', x, re.S) # strip out extensions
然后
#.kml header goes here
kmlTrack = """<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.ope......etc etc
然后
buf = StringIO.StringIO(x)
for line in buf:
if line is not None:
timm = re.search('time>(.*?)</time', line, re.S)
if timm is not None:
kmlTrack += (" <when>"+ timm.group(1)+"</when>\n")
checkSumA =+ 1
buf = StringIO.StringIO(x)
for line in buf:
if line is not None:
lat = re.search('lat="(.*?)" lo', line, re.S)
lon = re.search('lon="(.*?)"><ele>', line, re.S)
ele = re.search('<ele>(.*?)</ele>', line, re.S)
if lat is not None:
kmlTrack += (" <gx:coord>"+ lon.group(1) + " " + lat.group(1) + " " + ele.group(1) + "</gx:coord>\n")
checkSumB =+ 1
if checkSumA == checkSumB:
#put a footer on
kmlTrack += """ </gx:Track></Placemark></Document></kml>"""
else:
print ("checksum error")
return None
with open("outFile.kml", "a") as myfile:
myfile.write(kmlTrack)
return ("succsesful .kml file-write completed in :" + str(c.seconds) + " seconds.")
再次,这是有效但非常慢。如果有人能看到如何提高速度,请告诉我!干杯
已更新
感谢您的建议。我是Python的新手,并赞赏听说过分析。找到它。将它添加到我的脚本中。看起来它只有一件事,总运行时间为209秒的208,发生在一条线上。这是一个片段:
ncalls tottime percall cumtime percall filename:lineno(function)
....
4052 0.013 0.000 0.021 0.000 StringIO.py:139(readline)
8104 0.004 0.000 0.004 0.000 StringIO.py:38(_complain_ifclosed)
2 0.000 0.000 0.000 0.000 StringIO.py:54(__init__)
2 0.000 0.000 0.000 0.000 StringIO.py:65(__iter__)
4052 0.010 0.000 0.033 0.000 StringIO.py:68(next)
8101 0.018 0.000 0.078 0.000 re.py:139(search)
4 0.000 0.000 208.656 52.164 re.py:144(sub)
8105 0.016 0.000 0.025 0.000 re.py:226(_compile)
35 0.000 0.000 0.000 0.000 rpc.py:149(debug)
5 0.000 0.000 0.010 0.002 rpc.py:208(remotecall)
......
每次通话有4次5秒的通话。 cProfile说它发生在第144行,但我的脚本只有94行。我该如何继续前进?非常感谢。
答案 0 :(得分:3)
好的,谢谢大家。 cProfile显示它是一个re.sub
调用,虽然我最初不确定哪一个 - 虽然有一些试验和错误,它没有花很长时间来隔离它。解决方案是将re.sub
从“贪婪”调整为“非贪婪”调用。
旧标题条调用是x = re.sub(r'<(.*)<trkseg>', '', x, re.S) #strip header
现在变为x = re.sub(r'<?xml(.*?)<trkseg>', '', x, re.S) #strip header REALLY fast
。
它现在可以在零秒内完成甚至很重的.gxp转换。 ?
有什么不同!