1

我有一段代码将获取一个字符串并重复它,使得字符串的长度为 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

4 回答 4

3

这可能会稍微快一点:

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

我说“可能”,因为很多取决于典型的stringlength!使用'Hello World'and 61,我(在旧的 Mac 笔记本电脑上)将此时间设置为 1 微秒,而您的时间为 1.66 微秒;和'Hello World'*100, 61*1232.08 微秒 vs 2.68 微秒。您需要多快、多长的字符串以及 的典型值是多少length

注意//是“除以截断”(只是为了确保这在 Python 3 和 Python 2 中都有效;-)即使 Stack Overflow 正在对事物进行着色,就好像它是一个注释标记(如在 C++ 中)。

于 2010-06-20T01:48:11.340 回答
0

这里不需要做浮点数;在旧的 Python 版本中,只需说“int(length) / len(string)”,而在新版本中,您可以使用“//”运算符。当你得到结果时,你可以加 1 以确保它足够长。或者,以更多的添加为代价,您可以更精确,并且永远不要使初始字符串太长:

...
    return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
于 2010-06-20T01:44:57.727 回答
0

而不是int(math.ceil(float(length) / len(data)))你可以只使用length/len(data) + 1. 这不完全一样,但也应该可以。

在尝试加快速度之前,您确定此功能是性能瓶颈吗?你每秒会调用多少次?

要找出函数的哪个变体是您应该对其进行分析的最快变体,该timeit模块通常在那里很有用。

于 2010-06-20T01:45:04.573 回答
0

如果你真的想优化你需要用 C 重写你的函数作为 python 的扩展。

你可以在这里找到信息。对不起我的英语,我是新来的。

于 2010-06-20T02:43:40.557 回答