如果值已经是字符串,我应该避免转换为字符串吗?

Jea*_*bre 51 python string

有时您必须使用列表推导将所有内容转换为字符串,包括字符串本身.

b = [str(a) for a in l]
Run Code Online (Sandbox Code Playgroud)

但我必须这样做:

b = [a if type(a)==str else str(a) for a in l]
Run Code Online (Sandbox Code Playgroud)

我想知道str字符串是否足够优化,不能创建另一个字符串副本.

我试过了:

>>> x="aaaaaa"
>>> str(x) is x
True
Run Code Online (Sandbox Code Playgroud)

但这可能是因为Python可以缓存字符串,并重用它们.但是,对于字符串的任何值,这种行为是否得到保证?

Mar*_*ers 61

测试对象是否已经是字符串比仅总是转换为字符串要慢.

那是因为该str()方法也进行了完全相同的测试(对象已经是一个字符串).你是a)做两倍的工作,而b)你的测试开机速度较慢.

注意:对于Python 2,使用str()on unicode对象包括对ASCII的隐式编码,这可能会失败.您可能仍需要处理此类对象的特殊情况.在Python 3中,没有必要担心边缘情况.

正如围绕此讨论一样:

  • isinstance(s, str)有不同的含义时,s可以是一个子类str.由于子类的处理方式与任何其他类型的对象完全相同str()(在对象上__str____repr__在对象上调用),因此这种差异很重要.
  • 您应该type(s) is str用于确切的类型检查.类型是单身,利用这个,is更快:

    >>> import timeit
    >>> timeit.timeit("type(s) is str", "s = ''")
    0.10074466899823165
    >>> timeit.timeit("type(s) == str", "s = ''")
    0.1110201120027341
    
    Run Code Online (Sandbox Code Playgroud)
  • s if type(s) is str else str(s)对于非字符串情况,使用速度明显较慢:

    >>> import timeit
    >>> timeit.timeit("str(s)", "s = None")
    0.1823573520014179
    >>> timeit.timeit("s if type(s) is str else str(s)", "s = None")
    0.29589492800005246
    >>> timeit.timeit("str(s)", "s = ''")
    0.11716728399915155
    >>> timeit.timeit("s if type(s) is str else str(s)", "s = ''")
    0.12032335300318664
    
    Run Code Online (Sandbox Code Playgroud)

    (s = ''案件的时间非常接近并且保持交换位置).

本文中的所有时间都是在MacBook Pro 15"(2015年中),OS X 10.12.3上的Python 3.6.0上进行的.