python - 从映射连接字符串时的性能

标签 python python-3.8

我在从映射 (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/

相关文章:

python - 合并 Numpy 结构化数组中的记录

python - 通过 Pandas 列搜索值

ubuntu - 无法使用 Python3.8 在 Ubuntu 上安装 dbus-python

python - 当我尝试运行 Odoo 时,为什么会出现错误 "Name node can' t be use with 'None' Constant”?

apache - Apache 中的 `NameError: name ' 类型错误 ' is not defined`(mod_wsgi)

python - 无效的 OpenID 响应 : HTTP 599: SSL certificate problem, 验证 CA 证书是否正常。

python - 构建扩展时,distutils 会忽略对 setup.py 的更改吗?

python - Pygame 按键与指南的工作方式不同

pandas - 将行中的每个值与 pandas 数据框中的其他行配对

python - 将列表项转换为定义的数据类型