我在嵌入式平台上使用的是老版本的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, '')

07-25 21:06
查看更多