【发布时间】:2013-09-21 08:30:23
【问题描述】:
我正在处理一串字节(可以在 10kb 到 3MB 之间的任何位置),我需要过滤掉大约 16 个字节(用其他字节替换它们)
目前我有一个有点像这样的功能..
BYTE_REPLACE = {
52: 7, # first number is the byte I want to replace
53: 12, # while the second number is the byte I want to replace it WITH
}
def filter(st):
for b in BYTE_REPLACE:
st = st.replace(chr(b),chr(BYTE_REPLACE[b]))
return st
(为了这个问题而转述的字节列表)
使用 map 的执行时间约为 0.33 秒,而这会缩短 10 倍的时间约为 0.03 秒(两者都在压缩后的 HUGE 字符串上执行)。
虽然任何性能提升都可以忽略不计,但有没有更好的方法来做到这一点?
(我知道存储过滤后的字符串会更加优化。不过,这不是一个选项。我在愚弄 Minecraft Classic 服务器的关卡格式,并且必须过滤掉某些客户端不使用的字节'不支持)
【问题讨论】:
-
你在字符串中的阅读情况如何?是来自文件系统,还是来自 URL,是否已经全部在内存中?这可能会对最优方法产生很大影响。
-
它都在内存中可用(并且在每种情况下都直接传递给函数) 在少数情况下,单个字节将传递给这个函数 - 这可以忽略不计,我不介意由它。
-
BYTE_REPLACE中有多少对?只有 2 个? -
16 通常。使用完整列表和相当大的负载测试级别(512*512*256 字节未压缩),完成完全替换需要 0.03 秒(使用 str.replace)
-
string.maketrans和string.translate可能会有所帮助。
标签: python string performance replace