更快地解码 url-like 字符串
Decode url-like strings much quicker
我有几 GB 的数据编码在不同的 xml 文件中。由于某些原因,生成这些 xml 文件的(闭源)程序使用类似 url 的表示形式对文本进行编码,例如'08.06.2016 22:41:35'
变为 08%2E06%2E2016%2022%3A41%3A35
我感兴趣的数据中主要有空格、(十进制)点和冒号,但我需要保持代码对任何类型的十六进制表示形式开放。
目前,我正在使用 urllib.parse.unquote
。然而它非常慢:使用探查器我发现我的数据挖掘算法花费的时间中有 90% 是由于 urllib.parse.unquote
。您可以在下面看到它与替换的比较。
from urllib.parse import unquote
from time import clock
t0=clock()
for i in range(10000):
unquote('08%2E06%2E2016')
t1=clock()
t2=clock()
for i in range(10000):
'08%2E06%2E2016'.replace('%2E','\x2E')
t3=clock()
print('unquote time: ',t1-t0,'\nreplace time: ',t3-t2)
unquote time: 0.12173581222984353
replace time: 0.009713842143412421
我可以尝试用替换链接我知道的所有十六进制,但我仍然害怕遗漏某些东西。
我曾尝试使用 re.sub
或类似的但我没有成功:用 '\x' 替换 '%' 并不是那么简单。
有什么想法吗?
我正在使用 Python 3.5
我不认为在纯 Python 中可以快很多,但是 unquote_to_bytes
在我的机器上提供了大约 2 倍的加速:
from urllib.parse import unquote_to_bytes
unquote_to_bytes('08%2E06%2E2016').decode()
我有几 GB 的数据编码在不同的 xml 文件中。由于某些原因,生成这些 xml 文件的(闭源)程序使用类似 url 的表示形式对文本进行编码,例如'08.06.2016 22:41:35'
变为 08%2E06%2E2016%2022%3A41%3A35
我感兴趣的数据中主要有空格、(十进制)点和冒号,但我需要保持代码对任何类型的十六进制表示形式开放。
目前,我正在使用 urllib.parse.unquote
。然而它非常慢:使用探查器我发现我的数据挖掘算法花费的时间中有 90% 是由于 urllib.parse.unquote
。您可以在下面看到它与替换的比较。
from urllib.parse import unquote
from time import clock
t0=clock()
for i in range(10000):
unquote('08%2E06%2E2016')
t1=clock()
t2=clock()
for i in range(10000):
'08%2E06%2E2016'.replace('%2E','\x2E')
t3=clock()
print('unquote time: ',t1-t0,'\nreplace time: ',t3-t2)
unquote time: 0.12173581222984353
replace time: 0.009713842143412421
我可以尝试用替换链接我知道的所有十六进制,但我仍然害怕遗漏某些东西。
我曾尝试使用 re.sub
或类似的但我没有成功:用 '\x' 替换 '%' 并不是那么简单。
有什么想法吗?
我正在使用 Python 3.5
我不认为在纯 Python 中可以快很多,但是 unquote_to_bytes
在我的机器上提供了大约 2 倍的加速:
from urllib.parse import unquote_to_bytes
unquote_to_bytes('08%2E06%2E2016').decode()