我在从映射 (Mapping[str, str]
) 连接字符串时查看性能。
我有这两个简单的功能:
def nested(sequence, mapping):
string = ""
for x in sequence:
string += mapping[x]
return string
和
def flat(sequence, mapping):
return "".join(mapping[x] for x in sequence)
在我的项目中,我发现使用“平面”解决方案时性能明显下降。最初,我选择该解决方案是因为:“平面优于嵌套。”,但很快转向“嵌套”解决方案。
我用更简单的序列和映射运行了 timeit 测试:
letters = (
"a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z"
)
mymapping = {x: x for x in letters}
mysequence = "mysequence"
print(timeit.timeit("nested(mysequence, mymapping)", globals=globals()))
print(timeit.timeit("flat(mysequence, mymapping)", globals=globals()))
并获得:
In [683]: 0.675819274969399
0.965234256349504
“嵌套”解决方案的速度提高了 43%。 我在我的项目中观察到数倍于速度的情况。
在文档中,我们可以读到:“连接字符串序列的首选、快速方法是调用''.join(sequence)”。但我清楚地看到“+
”运算符在此配置中更快。
虽然我可以继续使用“嵌套”解决方案:
我是否缺少另一个“平面”解决方案? (字符串不能使用 sum()
)
您对这种行为有什么解释吗?
谢谢。
最佳答案
当你使用列表理解时,在我这边加入会更快:
def flat_list(sequence, mapping):
return "".join([mapping[x] for x in sequence])
2.5292927 # nested
2.3440613999999997 # flat_list
6.530926599999999 # flat
我的猜测是它与 this 有关.生成器表达式似乎有一些小的开销,并且重复 10000 次这种差异变得可见。
关于python - 从映射连接字符串时的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63792129/