高效的字符串转十六进制函数

3 投票
5 回答
1611 浏览
提问于 2025-04-17 05:16

我在一个嵌入式平台上使用旧版本的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

的基础上,你可以通过避免使用全局变量和属性查找,改为使用局部变量来进一步提高性能。局部变量经过优化,可以避免每次访问时都要查找字典。(这并不是一直如此,但我刚刚确认在1999年发布的1.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!

撰写回答