在 Python 中有什么理由更喜欢 startswith 而不是字符串切片?
Is there any reason to prefer startswith over string slicing in Python?
如果foo="apple"
,那么下面的语句是等价的:
foo.startswith("app")
foo[0:3] == "app"
从某种意义上说,两者都会return“真”。
有什么理由比另一种更喜欢一种方法吗?我的意思是:
- 一种方法明显比另一种快吗?
- 一种方法被认为比另一种方法 'Pythonic' 多还是少?
切片是通用功能的特例。如果您必须检查任何其他切片,而不是从字符串的开头或结尾,那么切片就可以了。但是对于这两种情况,startswith
和 endswith
提供了更好的可读性。
正如 Zen Of Python 所说“简单胜于复杂”和“可读性很重要”。所以 foo.startswith("app")
是一个更好的选择,除了效率非常重要的情况。
UPD:我进行了快速研究。看起来,这两种方法之间几乎没有时间差异。计算时间相差5%,基本可以忽略不计。
这是研究本身:
import random
import string
def get_random_string(length):
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
return result_str
txt = [get_random_string(random.randint(5, 20)) for i in range(1000)]
def time_slice():
s = datetime.now()
for i in txt:
check = i[0:5]
if i[0:5] == check:
pass
return (datetime.now() - s).microseconds
def time_func():
s = datetime.now()
for i in txt:
check = i[0:5]
if i.startswith(check):
pass
return (datetime.now() - s).microseconds
>>> sum(time_slice() for i in range(100)) / 100
... 316.15
>>> sum(time_func() for i in range(100)) / 100
... 303.08
是的...有。一个更清楚地表明了意图。
第一个更动态。您所要做的就是传递参数字符串。而第二个不仅需要您更改字符串,还需要更改范围 0:3
以补偿新字符串的长度。第一个更干净。
如果foo="apple"
,那么下面的语句是等价的:
foo.startswith("app")
foo[0:3] == "app"
从某种意义上说,两者都会return“真”。
有什么理由比另一种更喜欢一种方法吗?我的意思是:
- 一种方法明显比另一种快吗?
- 一种方法被认为比另一种方法 'Pythonic' 多还是少?
切片是通用功能的特例。如果您必须检查任何其他切片,而不是从字符串的开头或结尾,那么切片就可以了。但是对于这两种情况,startswith
和 endswith
提供了更好的可读性。
正如 Zen Of Python 所说“简单胜于复杂”和“可读性很重要”。所以 foo.startswith("app")
是一个更好的选择,除了效率非常重要的情况。
UPD:我进行了快速研究。看起来,这两种方法之间几乎没有时间差异。计算时间相差5%,基本可以忽略不计。
这是研究本身:
import random
import string
def get_random_string(length):
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
return result_str
txt = [get_random_string(random.randint(5, 20)) for i in range(1000)]
def time_slice():
s = datetime.now()
for i in txt:
check = i[0:5]
if i[0:5] == check:
pass
return (datetime.now() - s).microseconds
def time_func():
s = datetime.now()
for i in txt:
check = i[0:5]
if i.startswith(check):
pass
return (datetime.now() - s).microseconds
>>> sum(time_slice() for i in range(100)) / 100
... 316.15
>>> sum(time_func() for i in range(100)) / 100
... 303.08
是的...有。一个更清楚地表明了意图。
第一个更动态。您所要做的就是传递参数字符串。而第二个不仅需要您更改字符串,还需要更改范围 0:3
以补偿新字符串的长度。第一个更干净。