python - 有什么理由比 Python 中的字符串切片更喜欢 startwith 吗?
问题描述
如果foo="apple"
,则以下语句是等价的:
foo.startswith("app")
foo[0:3] == "app"
从某种意义上说,两者都将返回“True”。
有什么理由比另一种方法更喜欢一种方法吗?我的意思是:
- 一种方法是否比另一种方法快得多?
- 一种方法是否比另一种方法或多或少地被认为是“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
推荐阅读
- excel - 将特定单元格数据移动到另一个单元格
- python - 将 defaultdict(list) 保存到 csv 文件
- c# - Rotativa 1.7.4 ActionAsPDF,删除导航栏和打印按钮
- javascript - Canvas Rotate,toDataUrl,然后 Crop 正在破坏图像质量
- c# - 每次使用代码在数据网格中插入数据时如何添加新行?
- python - 将元组列表转换为该列表中使用的所有整数的列表
- spring-boot - 将 MVC webapp 部署到 tomcat 问题 URI
- asp.net - 基于下拉 (asp.net) 生成动态 Gridview
- cucumber - Cucumber Serenity NoSuchMethodException cucumber.runtime.SerenityBackend(ResourceLoader, TypeRegistry)
- azure - 唯一非聚集索引 - 插入重复值