【问题标题】:Which one is better for string reverse in Python 3?在 Python 3 中哪个更适合字符串反转?
【发布时间】:2018-12-04 04:06:46
【问题描述】:
s="google"
print("".join(reversed(s)))  //elgoog
print(s[::-1])  //elgoog

上面的字符串是使用python 3的reverse方法和slicing方法都显示相同的输出,但是从这个python编程语言中哪个最有效,为什么??

【问题讨论】:

标签: python string python-3.x performance


【解决方案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。

【讨论】:

    【解决方案2】:

    当您谈论效率时,您应该从哪个角度指定?内存、运行时、实现等。

    关于运行时,反向索引肯定更快,因为当您使用join 加上reversed 时,您调用的两个函数都有自己的缺陷(暂停和恢复函数的框架等),与简单的比较索引。但是,如果你想为了任何目的一个一个地循环字符,并且内存是一个问题(主要是当字符串很大时)你可以使用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 中的一个特定任务有多种方法。

    【讨论】:

    • @jpp 我相信 wim 的评论适用于 str.join 电话
    • @jpp reversed 确实复制字符串,它反向迭代。从来没有复制过。相反,s[::1] 确实创建了一个副本。这就是为什么用例对于决定什么是最有效的至关重要。
    • @Chris_Rands,谢谢,这更有意义。 reversed 作为迭代器,不会复制整个字符串。谢谢!
    • ''.join(...) 并没有因为“调用两个函数”而变慢。由于 Python 运行时中的迭代,它更慢。
    • @wim 是的,也是。但是使用这两个函数也有其明显的开销。另外,请注意,C 或 Python 级别的迭代都会使程序变慢(增加复杂性),但重要的是在 Python 级别发生的代码/解释的数量,在这种情况下创建/解释/等。一个函数两次有足够的开销让你的代码变慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多