更快地解码 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()