高效的字符串转十六进制函数
我在一个嵌入式平台上使用旧版本的Python(Telit平台上的Python 1.5.2+)。我遇到的问题是,我用来将字符串转换为十六进制的函数运行得非常慢。下面是这个函数:
def StringToHexString(s):
strHex=''
for c in s:
strHex = strHex + hexLoookup[ord(c)]
return strHex
hexLookup 是一个查找表(一个Python列表),里面包含了每个字符的十六进制表示。
我愿意尝试各种方法(更紧凑的函数,或者一些我不知道的语言技巧)。为了更清楚,这里有一些基准测试(在这个平台上的分辨率是1秒):
N是要转换为十六进制的输入字符数量,时间单位是秒。
- N | 时间(秒)
- 50 | 1
- 150 | 3
- 300 | 4
- 500 | 8
- 1000 | 15
- 1500 | 23
- 2000 | 31
是的,我知道,这个速度非常慢……但如果我能节省1到2秒,那就是进步。
所以任何解决方案都欢迎,特别是那些了解Python性能的人。
谢谢,
Iulian
PS1: (在测试了提供的建议后 - 保持ord调用):
def StringToHexString(s):
hexList=[]
hexListAppend=hexList.append
for c in s:
hexListAppend(hexLoookup[ord(c)])
return ''.join(hexList)
使用这个函数,我得到了以下时间:1/2/3/5/12/19/27(这明显好很多)
PS2(无法解释但速度飞快)非常感谢Sven Marnach的想法!!!:
def StringToHexString(s):
return ''.join( map(lambda param:hexLoookup[param], map(ord,s) ) )
时间:1/1/2/3/6/10/12
任何其他想法或解释都欢迎!
5 个回答
2
在
from string import join
def StringToHexString(s):
strHex = []
strHexappend = strHex.append
_hexLookup = hexLoookup
for c in s:
strHexappend(_hexLoookup[c])
return join(strHex, '')
5
把你的hexLoookup改成一个字典,直接用字符作为索引,这样你就不用每次都调用ord
了。
另外,不要通过拼接来构建字符串——这样做以前很慢。可以用join
来处理一个列表,这样更快。
from string import join
def StringToHexString(s):
strHex = []
for c in s:
strHex.append(hexLoookup[c])
return join(strHex, '')
0
def StringToHexString(s):
return ''.join( map(lambda param:hexLoookup[param], map(ord,s) ) )
看起来这个方法是最快的!谢谢你,Sven Marnach!