现在我理解了Python中
除了必须在
s.find()
和s.index()
之间的区别,感谢这个问题,我想知道哪种方法更快?除了必须在
try / except
中使用s.index()
可能会导致潜在开销之外,速度上是否有任何显著差异?s.find()
和s.index()
之间的区别,感谢这个问题,我想知道哪种方法更快?try / except
中使用s.index()
可能会导致潜在开销之外,速度上是否有任何显著差异?any_find_slice
的包装器。实现是相同的,唯一的区别是,如果`index`和`rindex`找不到结果,则会为您引发一个`ValueError`。如果你继续计时它们,你会看到它们之间没有明显的有意义的区别。➜ ~ python -m perf timeit -s "s = 'a' * 1000 + 'b'" "s.find('b')"
Median +- std dev: 399 ns +- 7 ns
➜ ~ python -m perf timeit -s "s = 'a' * 1000 + 'b'" "s.index('b')"
Median +- std dev: 396 ns +- 3 ns
perf
进行计时。
我猜其他 Python 实现的情况应该是相同的。两种方法都执行相同的操作,只有在请求的元素未被找到时它们的反应略有不同。
str.index
抛出的异常,但这是唯一会使其变慢的事情。除此之外,它们做的事情是相同的。 - Dimitris Fasarakis Hilliards.find()
和s.index()
的性能相当好。s.index()
的速度会明显变慢。我们可以使用以下代码片段进行测试。$ python3 -m timeit -s "s = 'a' * 1000" "s.find('b')"
5000000 loops, best of 5: 87.3 nsec per loop
$ python3 -m timeit -s "s = 'a' * 1000" "try: s.index('b')" "except ValueError: pass"
1000000 loops, best of 5: 242 nsec per loop
s.find()
是胜利者,但这只是因为我们没有为其添加try
/except
块吗?s.find()
添加一个try
/except
块(尽管我们知道它不会被触发)。$ python3 -m timeit -s "s = 'a' * 1000" "try: s.find('b')" "except ValueError: pass"
5000000 loops, best of 5: 89.1 nsec per loop
try
/except
块几乎不会改变时间。只有当异常实际触发时,我们才会遭受到有意义的性能损失。s.find()
。s.find()
或s.index()
。在这种情况下,你可能更喜欢使用s.index()
,因为try
/except
语法向其他开发人员表明,你正在处理一个不太可能经常发生的边缘情况。
timeit
! - Wombatz