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

sri*_* pv 5 python string performance python-3.x

s="google"
print("".join(reversed(s)))  //elgoog
print(s[::-1])  //elgoog
Run Code Online (Sandbox Code Playgroud)

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

Kas*_*mvd 6

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

考虑到运行时,反向索引肯定更快,因为当您使用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'
Run Code Online (Sandbox Code Playgroud)

所以结论是,你应该根据你的需要选择方法,实际上这就是为什么 Python 中的一项特定任务有多种方法。

  • @jpp 我相信 wim 的评论适用于“str.join”调用*之后* (2认同)
  • @jpp ``reversed`` 不会*复制字符串,而是反向*迭代*。从来没有复制过。相反,``s[::1]`` 确实创建了一个副本。这就是为什么用例对于决定什么是最有效的至关重要。 (2认同)

wim*_*wim 2

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

\n\n

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

\n\n
>>> s = "google"\n>>> %timeit "".join(reversed(s))\n612 ns \xc2\xb1 20.8 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\n>>> %timeit s[::-1]\n157 ns \xc2\xb1 3.96 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于较大的字符串,运行时的改进正在增加:

\n\n
>>> s = s*1000\n>>> %timeit "".join(reversed(s))\n119 \xc2\xb5s \xc2\xb1 2.37 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n>>> %timeit s[::-1]\n10.8 \xc2\xb5s \xc2\xb1 123 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

macOS 上的 CPython 3.7.0b4。

\n