首页 > 解决方案 > 有什么理由比 Python 中的字符串切片更喜欢 startwith 吗?

问题描述

如果foo="apple",则以下语句是等价的:

foo.startswith("app")
foo[0:3] == "app"

从某种意义上说,两者都将返回“True”。

有什么理由比另一种方法更喜欢一种方法吗?我的意思是:

  1. 一种方法是否比另一种方法快得多?
  2. 一种方法是否比另一种方法或多或少地被认为是“Pythonic”?

标签: pythonslicestartswith

解决方案


切片是通用功能的一种特殊情况。如果您必须检查任何其他切片,而不是从字符串的开头或结尾,那么切片就可以了。但为这两种情况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

推荐阅读