是
text.startswith('a')
优于
text[0]=='a'
知道文本不是空的,我们只对它的第一个字符感兴趣。
答案 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
可以使用任意长度,可以使用空字符串,我更喜欢。
索引只能在指定长度的情况下使用,而不能用于空字符串。