【发布时间】:2025-12-07 06:45:01
【问题描述】:
假设我有一个字符串s = 'BINGO';我想遍历字符串以生成'B I N G O'。
这就是我所做的:
result = ''
for ch in s:
result = result + ch + ' '
print(result[:-1]) # to rid of space after O
有没有更有效的方法来解决这个问题?
【问题讨论】:
-
在我的机器上,这大约需要 500ns。这真的是您程序中的瓶颈吗?如果没有,不要问效率;询问简单性、可读性等——真正重要的事情。
-
@abarnert 或许 efficient 对您来说意味着某些特殊的东西,但它实际上 不一定意味着 machine 效率。
-
@kojiro:“高效”是指门徒/专业/爱好/等方面的特殊事物。计算机编程,这就是这个网站的内容,所以这就是重要的定义。这就是为什么这个网站有一个专门用于该目的的效率标签。
-
是的,@abarnert 是对的——这个解决方案的问题首先不是它效率低下,而是它不是 Python 的,也不简单。
' '.join(s)是简单的 Pythonic 方式。但是,效率是一个问题,因为上面的解决方案是O(N^2),而join是O(N)——这对'BINGO'无关紧要,但对长字符串很重要。 -
@BenHoyt:它看起来与小字符串呈线性关系的原因是,复制字符串基本上只是对 memmove 的调用——当然,它仍然循环,但它在通常高度优化的 C 代码中这样做对于平台(尤其是在 x86 上,它具有专门设计用于加速 memmove 的操作码)。因此,第二个 N 上的常数乘数比第一个上的要小几个数量级,这使得在 N 变得非常大之前很难看到。