有时您必须使用列表推导将所有内容转换为字符串,包括字符串本身.
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上进行的.
归档时间: |
|
查看次数: |
4209 次 |
最近记录: |