2016-09-23 50 views
9

当一个对象转换为在python字符串,只见两个不同的成语str函数和百分比运营商之间的差:是否有在Python

答:mystring = str(obj)

B:mystring = "%s" % obj

是这两者有什么区别? (阅读Python文档,我怀疑没有,因为后一种情况下将隐含调用str(obj)obj转换为字符串。

如果是的话,我应该使用哪一个?

如果没有,哪一个我应该在“好”的Python代码更喜欢哪个?(从Python的哲学“明确了隐”,A将被认为是更好的?)

+0

我会去的第一个,但很好的问题(+1) - 我相信一些专业pythonistas将非常愿意回答:) – Jan

回答

16

第二个版本做更多的工作。

%s运营商的要求str()它插值的值,但它也有t o首先解析模板字符串,首先找到占位符。

除非您的模板字符串包含更多文本,否则要求Python在"%s" % obj表达式上花费更多周期是没有意义的。

然而,矛盾的是,str()转换,在实践中,慢作为查找名称str()和推栈调用的函数需要更多的时间比字符串解析:

>>> from timeit import timeit 
>>> timeit('str(obj)', 'obj = 4.524') 
0.32349491119384766 
>>> timeit('"%s" % obj', 'obj = 4.524') 
0.27424097061157227 

可以收回大部分通过结合str到本地的名头是区别:

>>> timeit('_str(obj)', 'obj = 4.524; _str = str') 
0.28351712226867676 

对于大多数Python开发者,使用字符串模板选项将是为混乱210更直接。坚持这个功能,除非你有一个关键部分进行了大量的字符串转换。

+1

我不会期望这些数字。感谢timeit结果 – sisanared

+0

谢谢你的确切和快速的答案;) –

+0

另外,如果'obj'是一个元组,''%s“%obj'技巧将会失败。 –