2

我在 CodingBat.com 上解决了一个 Python 问题。我为打印字符串 n 次的简单问题编写了以下代码-

def string_times(str, n):
    return n * str

官方结果是——

def string_times(str, n):
    result = ""
    for i in range(n):
       result = result + str
    return result

print string_times('hello',3)

两个函数的输出相同。我很好奇字符串乘法(第一个函数)如何在性能基础上针对 for 循环(第二个函数)执行。我的意思是哪一个更快并且最常用?

另外请建议我自己获得这个问题的答案(使用 time.clock() 或类似的东西)

4

3 回答 3

7

我们可以使用timeit模块进行测试:

python -m timeit "100*'string'"
1000000 loops, best of 3: 0.222 usec per loop

python -m timeit "''.join(['string' for _ in range(100)])"
100000 loops, best of 3: 6.9 usec per loop

python -m timeit "result = ''" "for i in range(100):" "  result = result + 'string'"
100000 loops, best of 3: 13.1 usec per loop

您可以看到乘法是更快的选择。您可以注意到,虽然字符串连接版本在 CPython 中并没有那么糟糕,但在其他版本的 Python 中可能并非如此。您应该始终选择字符串乘法或str.join()出于这个原因 - 不仅是速度,还有可读性和简洁性。

于 2012-05-02T17:12:16.390 回答
4

我已经为以下三个功能计时:

def string_times_1(s, n):
    return s * n

def string_times_2(s, n):
    result = ""
    for i in range(n):
       result = result + s
    return result

def string_times_3(s, n):
    "".join(s for _ in range(n))

结果如下:

In [4]: %timeit string_times_1('hello', 10)
1000000 loops, best of 3: 262 ns per loop

In [5]: %timeit string_times_2('hello', 10)
1000000 loops, best of 3: 1.63 us per loop

In [6]: %timeit string_times_3('hello', 10)
100000 loops, best of 3: 3.87 us per loop

如您所见,s * n它不仅最清晰、最简洁,而且也是最快的。

于 2012-05-02T17:13:55.490 回答
2

您可以从命令行或代码中使用timeit的东西来查看一些 python 代码的速度:

$ python -m timeit "\"something\" * 100"
1000000 loops, best of 3: 0.608 usec per loop

为您的其他功能做类似的事情并进行比较。

于 2012-05-02T17:05:51.977 回答