我在嵌入式平台上使用的是老版本的python(Python 1.5.2+ on Telit platform)。我的问题是把字符串转换成十六进制的函数它很慢。功能如下:
def StringToHexString(s):
strHex=''
for c in s:
strHex = strHex + hexLoookup[ord(c)]
return strHex
hex lookup是一个查找表(python列表),包含每个字符的所有十六进制表示。
我愿意尝试一切(一个更紧凑的函数,一些我不知道的语言技巧)。更清楚的是基准(在该平台上分辨率为1秒):
n是要转换为十六进制的输入字符数,时间以秒为单位。
n时间(秒)
50 1
150 | 3
300 4
500 | 8
1000 | 15
1500 23
2000 | 31
是的,我知道,很慢…但如果我能获得1到2秒的时间,那将是一个进步。
所以任何解决方案都是受欢迎的,特别是那些了解python性能的人。
谢谢,
尤利安
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
欢迎提出其他意见/解释!
最佳答案
使hexLoookup成为一个由字符本身编制索引的字典,这样就不必每次都调用ord
。
另外,不要连接到构建字符串-这以前很慢。改为在列表中使用join
。
from string import join
def StringToHexString(s):
strHex = []
for c in s:
strHex.append(hexLoookup[c])
return join(strHex, '')