Python 3中的字符串反向哪个更好?

时间:2018-06-25 14:28:54

标签: python string python-3.x performance

s="google"
print("".join(reversed(s)))  //elgoog
print(s[::-1])  //elgoog

在上面的字符串中,使用python 3反向方法和切片方法返回的字符串都显示相同的输出,但是从python编程语言来看,这是最有效的,为什么?

2 个答案:

答案 0 :(得分:4)

当谈到效率时,应该从哪个角度进行说明?内存,运行时,实现等

关于运行时,反向索引肯定更快,因为当您使用joinreversed时,您要调用两个都有其自身缺陷的函数(挂起和恢复函数的框架等)。比较简单的索引。但是,如果出于任何目的想要一一遍历字符,而内存是一个问题(通常是在字符串较大时),则可以使用reversed,因为它返回迭代器对象。

In [2]: s = "example"

In [4]: r = reversed(s)

In [5]: next(r)  # e.g. You can access to the characters using `next()`
Out[5]: 'e'

因此得出的结论是,您应该根据需要选择方法,这实际上就是为什么在Python中有多种方法可以完成一项特定任务。

答案 1 :(得分:1)

内存效率没有显着差异。由于字符串是不可变的,因此两种方法都必须复制整个数据。

要检查性能,可以使用标准库中的timeit模块。由于避免了Python代码内的迭代,切片速度明显更快:

>>> s = "google"
>>> %timeit "".join(reversed(s))
612 ns ± 20.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> %timeit s[::-1]
157 ns ± 3.96 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

对于较大的字符串,运行时改进在不断提高:

>>> s = s*1000
>>> %timeit "".join(reversed(s))
119 µs ± 2.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit s[::-1]
10.8 µs ± 123 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

macOS上的CPython 3.7.0b4。