Rom*_*huk 3 python compilation internals object-identity
你能描述两种字符串连接方式之间的区别:简单的__add__运算符和%s模式吗?我在这个问题上进行了一些调查,发现%s(没有使用括号的形式)更快一点.
还出现了另一个问题:为什么结果'hell%s' % 'o'指的是另一个记忆区域'hell%s' % ('o',)?
有一些代码示例:
l = ['hello', 'hell' + 'o', 'hell%s' % 'o', 'hell%s' % ('o',)]
print [id(s) for s in l]
Run Code Online (Sandbox Code Playgroud)
结果:
[34375618400, 34375618400, 34375618400, 34375626256]
Run Code Online (Sandbox Code Playgroud)
PS我知道字符串实习:)
这是一个小练习:
>>> def f1():
'hello'
>>> def f2():
'hel' 'lo'
>>> def f3():
'hel' + 'lo'
>>> def f4():
'hel%s' % 'lo'
>>> def f5():
'hel%s' % ('lo',)
>>> for f in (f1, f2, f3, f4, f5):
print(f.__name__)
dis.dis(f)
f1
1 0 LOAD_CONST 1 (None)
3 RETURN_VALUE
f2
1 0 LOAD_CONST 1 (None)
3 RETURN_VALUE
f3
2 0 LOAD_CONST 3 ('hello')
3 POP_TOP
4 LOAD_CONST 0 (None)
7 RETURN_VALUE
f4
2 0 LOAD_CONST 3 ('hello')
3 POP_TOP
4 LOAD_CONST 0 (None)
7 RETURN_VALUE
f5
2 0 LOAD_CONST 1 ('hel%s')
3 LOAD_CONST 3 (('lo',))
6 BINARY_MODULO
7 POP_TOP
8 LOAD_CONST 0 (None)
11 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
如您所见,所有简单的连接/格式化都是由编译器完成的.最后一个函数需要更复杂的格式,因此,我猜,实际上是执行的.由于在编译时创建的所有对象都具有相同的id.