gpt4 book ai didi

python - str.replace(..).replace(..) 令人作呕的是 Python 中的标准习语吗?

转载 作者:IT老高 更新时间:2023-10-28 22:10:25 26 4
gpt4 key购买 nike

例如,假设我想要一个函数来转义字符串以在 HTML 中使用(如在 Django 的 escape filter 中):

    def escape(string):
"""
Returns the given string with ampersands, quotes and angle
brackets encoded.
"""
return string.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&#39;').replace('"', '&quot;')

这可行,但它很快变得丑陋并且算法性能似乎很差(在这个例子中,字符串被重复遍历了 5 次)。最好是这样的:

    def escape(string):
"""
Returns the given string with ampersands, quotes and angle
brackets encoded.
"""
# Note that ampersands must be escaped first; the rest can be escaped in
# any order.
return replace_multi(string.replace('&', '&amp;'),
{'<': '&lt;', '>': '&gt;',
"'": '&#39;', '"': '&quot;'})

这样的函数是否存在,或者是使用我之前写的标准的 Python 习语?

最佳答案

您是否有一个运行速度过慢的应用程序,并且您对其进行了分析以发现像此代码段这样的行导致它运行缓慢?瓶颈出现在意想不到的地方。

当前代码段遍历字符串 5 次,每次做一件事。你建议遍历一次,可能每次做五件事(或者至少每次做一些事情)。目前尚不清楚这是否会自动对我做得更好。目前使用的算法是 O(n*m) (假设字符串的长度比规则中的东西长),其中 n 是字符串的长度,m 是替换规则的数量。我认为,您可以将算法复杂性降低到像 O(n*log(m)) 之类的东西,并且在我们所处的特定情况下——原始的东西都只有一个字符(但不是在多个调用的情况下) replace)——O(n),但这并不重要,因为 m 是 5n 是无界的

如果 m 保持不变,那么两种解决方案的复杂度实际上都为 O(n)。我不清楚尝试将五个简单的通行证变成一个复杂的通行证是否是一项有值(value)的任务,我目前无法猜测其实际时间。如果有什么东西可以让它更好地扩展,我会认为这是更有值(value)的任务。

一次通过而不是连续通过还需要回答有关如何处理冲突规则以及如何应用这些规则的问题。使用 replace 链可以清楚地解决这些问题。

关于python - str.replace(..).replace(..) 令人作呕的是 Python 中的标准习语吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com