我有一段代码,它会接受一个字符串并重复它,使字符串的长度为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'
有没有办法优化它? 我需要这个操作很快,因为它会被大量使用。 请注意,这也需要使用列表。
答案 0 :(得分:3)
这可能会略微加快:
def repeat(string, length):
L = len(string)
return string * (length // L) + string[:length % L]
我说“可能”,因为LOT取决于典型的string
和length
!使用'Hello World'
和61
,我已将此时间(在旧的Mac笔记本电脑上)定时为1微秒,相比之下为1.66微秒; 'Hello World'*100
和61*123
,2.08微秒vs 2.68。只需 如何快速,您需要什么长度的字符串以及length
的典型值?
注意//
是“除以截断”(只是为了确保它在Python 3以及Python 2中起作用;-)即使Stack Overflow将事物着色就好像它是注释标记一样(如在C ++中) )。
答案 1 :(得分:0)
这里没有必要做浮点数;在旧的Python版本中,只需说“int(length)/ len(string)”,在新版本中,您可以使用“//”运算符。当你得到结果时,你可以加1来确保它足够长。或者,以更多的添加为代价,您可以更精确,并且永远不会使初始字符串太长:
...
return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
答案 2 :(得分:0)
而不是int(math.ceil(float(length) / len(data)))
,您可以使用length/len(data) + 1
。这不完全相同,但也应该有效。
在尝试加快速度之前,您确定此功能是性能瓶颈吗?你会每秒呼叫它几千次?
要找出函数的哪个变体是最快的,你应该对它进行分析,timeit
模块通常在那里很有用。
答案 3 :(得分:0)
如果你真的想要优化你需要在C中重写你的函数作为python的扩展。
您可以找到信息here。 对不起我的英语,我是新来的。