【问题标题】:Which is faster between s.find() and s.index()s.find() 和 s.index() 哪个更快
【发布时间】:2017-03-02 09:32:32
【问题描述】:

现在我通过this question了解了Python中s.find()s.index()之间的区别,我想知道哪种方法更快?

如果我们必须将s.index() 包含在try/except 中,除了潜在的开销之外,在速度方面是否有任何显着差异?

【问题讨论】:

  • 时间复杂度而言(天啊)两者是等价的。
  • 我知道他们可能使用类似的(如果不相同的话)算法,并且仅在输出上有所不同,但我只是想知道是否存在明显的性能差异。
  • 如果你想知道什么更快timeit!

标签: python string python-3.x


【解决方案1】:

如果我们必须将s.index() 包含在try/except 中,除了潜在的开销之外,速度方面是否有任何显着差异。

至少在 (C)Python 中,findindexrfindrindex 都是内部函数 any_find_slice 的包装器。

实现是一样的。唯一的区别是indexrindex 如果发现调用any_find_slice 的结果是-1 会为你生成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 的其他实现中这应该没有什么不同。两种方法都做同样的事情,只是在未找到请求的元素时它们的反应方式不同。

【讨论】:

  • 谢谢,所以它们在内部确实是相同的功能。所以我想应该不会有任何明显的速度/性能差异......
  • @YeO 您通常需要防范str.index 引发的异常,但这是唯一会使其变慢的事情。除此之外,他们做同样的事情。
  • 只是想补充一点,在这两个配置文件中,都找到了子字符串,因此没有实质性区别。当未找到子字符串时,两者之间会有很大差异(索引要慢很多)。
猜你喜欢
  • 2011-12-08
  • 2020-05-12
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多