在Python中反转字符串的最快方法

5
我能够想出两种不同的方法来在Python中反转一个字符串。
常识告诉我们,代码行数越多,运行速度越慢。我用两种方式反转了这个字符串。
实现方式1:
"".join(reversed(map(lambda x:x,st)))

实施方案2:
st[::-1]

这两个的性能相似。即使对于一个20000个字符的字符串,差异也不到一毫秒。
我认为第一个方法应该更慢,因为它执行了3倍的操作。
为什么我看不到性能差异呢?

3
你是如何计时这两个的?我对于一个包含20,000个字符的字符串得到了合理的结果:https://i.imgur.com/DhKaxhR.png - Blender
4
第一种情况下为什么你没有使用:''.join(reversed(st)? - Cyb3rFly3r
我在代码开头使用了time.now(),并在结尾处再次使用time.now()来进行基准测试。@Cyb3rFly3r:这不是为了想出一个高效的算法,而是要看看这两个算法中哪一个更快。 但是,''.join(reversed(st))没有出现在我的脑海中。 - Ashmeet Singh
2个回答

24

我看到了一个不同之处。

首先,map(lambda x: x, st) 是什么意思?它的目的是什么?

使用 timeit 模块来测试你的代码:

$ python -m timeit '"".join(reversed("abcdefghijklmnopqrstuvwxyz"))'
1000000 loops, best of 3: 0.586 usec per loop
$ python -m timeit '"abcdefghijklmnopqrstuvwxyz"[::-1]'           
10000000 loops, best of 3: 0.0715 usec per loop

正如您所看到的,对于这个特定的输入,在我的机器上,切片操作大约快8倍。它也更为简洁。


这更符合我的期望;在Python社区中已知方法2比其他所有方法都更快地反转字符串。 - Cyb3rFly3r
"".join非常低效...与仅仅反转相比,这个执行多个操作。 - O.rka
@KellyBundy:你觉得长度的差异在这里是否有重要的影响?我选择更长的字符串只是为了便于测量。我认为很难辩称来自更长字符串的结果不能推广到来自较短字符串的结果。 - Dietrich Epp
这些评论对答案没有改进作用,所以我不会将它们合并进去。 - Dietrich Epp
"你必须在回答中添加借口和猜测" 不,我甚至不需要回答。我完全愿意等待问题提问者在撰写答案之前提供所有所需信息。"听起来你没有能够改进这个答案的可行建议" - 用其长度来衡量而不是一个截然不同的指标是一个可以改进这个答案的可行建议。 - Kelly Bundy
显示剩余7条评论

2
s=input("enter string")
print(s[::-1])

2
这只是将问题中的一个选项添加到答案中,该问题需要比较两个选项。 - atline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接