startwith有多好?

时间:2009-08-22 09:02:24

标签: python

text.startswith('a')  

优于

text[0]=='a'  

知道文本不是空的,我们只对它的第一个字符感兴趣。

10 个答案:

答案 0 :(得分:30)

如果text[0]为空字符串,则

text失败:

IronPython 2.6 Alpha (2.6.0.1) on .NET 4.0.20506.1
Type "help", "copyright", "credits" or "license" for more information.
>>> text = ""
>>> print(text.startswith("a"))
False
>>> print(text[0]=='a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: index out of range: 0

编辑:你说你“知道”text不是空的......你对此有多自信,如果 实际上是空的,你会想要发生什么? ?如果失败是合适的(例如,这意味着您的代码中存在错误),则会鼓励使用text[0]=='a'

其他问题:

  • 您对此的表现有多关注?如果这对性能至关重要,那么在特定的Python运行时上对它进行基准测试。我不会完全惊讶地发现(比方说)一个表格在IronPython上更快,而另一个表格在CPython上更快。

  • (和你的团队)发现哪些更具可读性?

答案 1 :(得分:23)

我同意其他开头更易读的内容,你应该使用它。也就是说,如果性能对于这种特殊情况来说是一个大问题,请将其标记为:

$ python -m timeit -s 'text="foo"' 'text.startswith("a")'
1000000 loops, best of 3: 0.537 usec per loop

$ python -m timeit -s 'text="foo"' 'text[0]=="a"'
1000000 loops, best of 3: 0.22 usec per loop

所以text[0]速度提高了2.5倍 - 但这是一个非常快速的操作;根据系统的不同,每次比较可节省约0.3微秒。除非你在时间紧迫的情况下进行数百万次比较,否则我仍然会使用更具可读性的开头。

答案 2 :(得分:10)

我个人认为startswith更具可读性。

此外,从Python 2.5 startwith可以获取一组前缀来查找:

>>> "hello world".startswith(("hello","goodbye"))
True

答案 3 :(得分:10)

是的:它更易于使用且更易于阅读。当您测试多个字母时,使用切片时,您必须知道目标文本的长度:

haystack = 'Hello, World!'
needle = 'Hello'

# The easy way
result = haystack.startswith(needle)

# The slightly harder way
result = haystack[:len(needle)] == needle

编辑:问题似乎已经改变了。它现在说,“知道文本不是空的,我们只对它的第一个字符感兴趣。”这使它成为一个相当无意义的假设情境。

我怀疑提问者正试图“优化”他/她的代码以执行速度。如果是这样的话,我的回答是:不要。使用哪种形式更易于阅读,因此,当您必须在一年后回来处理它时,更易于维护。只有在分析显示该行代码成为瓶颈时才进行优化。这不是一些O(n²)算法。这是一个字符串比较。

答案 4 :(得分:8)

由于可读性,

PEP 8明确告诉使用startswith

- Use ''.startswith() and ''.endswith() instead of string
     

切片检查         用于前缀或后缀。

  startswith() and endswith() are cleaner and less error prone.  For
  example:

    Yes: if foo.startswith('bar'):

    No:  if foo[:3] == 'bar':

答案 5 :(得分:5)

问题的存货短语是:“过早优化是所有邪恶的根源。”

答案 6 :(得分:5)

如果字符串为空,

text[0]可能会失败,但等效的text[:1]是安全的。

如果您想比较多个字符,我相信.startswith()更好。

答案 7 :(得分:2)

def compo2():
    n = "abba"
    for i in range(1000000):
        n[:1]=="_"

def compo():
    n = "abba"
    for i in range(1000000):
        n.startswith("_")

c compo2的cProfile报告为0.061,而我的计算机上为compo的报告为0.954。 如果你想对各种“_mystring”进行大量的前缀检查,这是有意义的。 如果大多数字符串不以下划线开头,那么在使用string[:1]== char之前使用startswith是优化代码的选项。 在一个真正的应用程序中,这种方法为我节省了大约15%的CPU时间。

答案 8 :(得分:1)

考虑到性能,

text [0] =='a'是好的。此外,您还需要在使用时添加验证。

答案 9 :(得分:0)

我的想法:

  • startswith可以使用任意长度,可以使用空字符串,我更喜欢。

  • 索引只能在指定长度的情况下使用,而不能用于空字符串。