【发布时间】:2020-09-08 10:36:32
【问题描述】:
我在从映射 (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() 可能带有字符串)
你对这种行为有解释吗?
谢谢。
【问题讨论】:
-
这在很大程度上取决于您要加入的什么。例如,仅 10 个字符的字符串就可以轻松放入各种缓存中,从而抵消大部分成本。比较例如
mymapping = {x: x*1024 for x in letters}. -
@MisterMiyagi 我发现与您的 mymapping 以及在我的项目中字符串是复杂的正则表达式的性能观察结果相当。我认为它与每个函数在内部的工作方式更相关(参见其他答案中提出的 flat_list 和 remap 函数)。
标签: python python-3.8