优化:Python 字符串重复

1 投票
4 回答
1697 浏览
提问于 2025-04-16 00:12

我有一段代码,它可以把一个字符串重复,直到这个字符串的长度达到x。

>>> import math
>>> def repeat(data, length):
        return (data * int(math.ceil(float(length) / len(data))))[:length]
>>> repeat("Hello World", 22)
'Hello WorldHello World'
>>> repeat("Hello World", 20)
'Hello WorldHello Wor'

有没有什么办法可以让它更快呢?因为这个操作会被频繁使用。还有,这个功能也需要适用于列表。

4 个回答

0

你可以用 length/len(data) + 1 来代替 int(math.ceil(float(length) / len(data)))。虽然这两个方法不完全一样,但也能达到效果。

在你尝试让这个函数更快之前,先想想这个函数是不是性能瓶颈?你每秒会调用它几千次呢?

要找出哪个版本的函数最快,你可以进行性能测试,通常 timeit 模块会很有帮助。

0

这里其实不需要用浮点数。在旧版本的Python中,你只需要写“int(length) / len(string)”,而在新版本中,你可以用“//”这个符号。得到结果后,你可以直接加1,确保结果足够长。或者,如果你愿意多加几次,就可以更精确一点,确保最开始的字符串不会太长:

...
    return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
3

这可能会稍微快一点:

def repeat(string, length):
  L = len(string)
  return string * (length // L) + string[:length % L]

我说“可能”是因为很多事情都取决于你用的字符串长度!比如用'Hello World'61这个例子,我在一台老款Mac笔记本上测试过,结果是1微秒对比你的1.66微秒;再比如用'Hello World'*10061*123,结果是2.08微秒对比你的2.68微秒。你到底需要多快的速度,字符串的长度是多少,length的典型值又是什么呢?

注意,//是“整除”的意思(这样可以确保在Python 3和Python 2中都能正常工作;-) 尽管Stack Overflow把它标记成了注释符号(就像在C++中一样)。

撰写回答