在 Python 3 中,哪一个更适合字符串反转?


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

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

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

考虑到运行时,反向索引肯定更快,因为当您使用joinplusreversed时,您正在调用两个函数,与简单的索引相比,这两个函数都有自己的缺陷(挂起和恢复函数的框架等(。但是,如果您想出于任何目的逐个循环访问字符,并且内存是一个问题(主要是当字符串很大时(,您可以使用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中有一个特定的任务有多种方法的原因。

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

要检查性能,您可以使用标准库中的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)

CPython 3.7.0b4 在 macOS 上。

最新更新