startswith的效果如何?
是
text.startswith('a')
比
text[0]=='a'
好吗?
我们知道文本不是空的,并且我们只关心它的第一个字符。
10 个回答
11
是的:这样用起来更简单,也更容易理解。当你要检查多个字母时,如果用切片的方法,你需要知道目标文本的长度:
haystack = 'Hello, World!'
needle = 'Hello'
# The easy way
result = haystack.startswith(needle)
# The slightly harder way
result = haystack[:len(needle)] == needle
补充:问题似乎发生了变化。现在说的是,“知道文本不是空的,我们只关心它的第一个字符。”这让问题变得有些无意义。
我怀疑提问者是在尝试“优化”他的代码执行速度。如果真是这样,我的建议是:别这样做。用更易读的方式,这样当你一年后再回来处理这段代码时,会更容易维护。只有在性能分析显示那行代码是瓶颈时,才考虑优化。这不是某种复杂的O(n²)算法。这只是字符串比较。
33
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
不是空的……你对此有多自信?如果它实际上是空的,你希望发生什么?如果出错是合适的(比如这意味着你的代码有bug),那么这会促使你使用 text[0]=='a'
。
其他问题:
你对这个性能有多担心?如果这个性能很关键,那就要在你特定的Python运行环境中进行基准测试。我不会感到太惊讶,如果发现(比如)某种形式在IronPython上更快,而另一种在CPython上更快。
你(和你的团队)觉得哪种写法更容易理解?
32
我同意其他人的看法,使用startswith会更容易理解,你应该选择这个。不过,如果在某些特殊情况下性能非常重要,那就需要测试一下速度:
$ 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微秒。不过,除非你在一个时间非常紧迫的情况下要进行数百万次比较,否则我还是建议使用更易读的startswith。