优化:Python 字符串重复
我有一段代码,它可以把一个字符串重复,直到这个字符串的长度达到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'*100
和61*123
,结果是2.08微秒对比你的2.68微秒。你到底需要多快的速度,字符串的长度是多少,length
的典型值又是什么呢?
注意,//
是“整除”的意思(这样可以确保在Python 3和Python 2中都能正常工作;-) 尽管Stack Overflow把它标记成了注释符号(就像在C++中一样)。