反引号对python解释器意味着什么:`num`

我在玩弄列表parsing,并在另一个网站上看到这个小片段:

return ''.join([`num` for num in xrange(loop_count)]) 

我花了几分钟的时间试图复制函数(通过键入),然后才实现了`num`位的分解。

在这些angular色中包含一个陈述是什么呢? 从我所能看到的是str(num)的等价物。 但是当我计时时:

 return ''.join([str(num) for num in xrange(10000000)]) 

它需要4.09s,而:

 return ''.join([`num` for num in xrange(10000000)]) 

需要2.43s。

两者都给出了相同的结果,但一个是慢很多。 这里发生了什么?

编辑:奇怪… repr()给出比`num`稍慢的结果。 2.99s vs 2.43s。 使用Python 2.6(尚未尝试3.0)。

反引号是repr()别名。 不要再使用它们,Python 3.0中的语法被删除了。

使用反引号似乎比在版本2.x中使用repr(num)num.__repr__()更快。 我想这是因为在全局命名空间(for repr )或对象的命名空间(for __repr__ )中需要额外的字典查找。


使用dis模块certificate了我的假设:

 def f1(a): return repr(a) def f2(a): return a.__repr__() def f3(a): return `a` 

拆解节目:

 >>> import dis >>> dis.dis(f1) 3 0 LOAD_GLOBAL 0 (repr) 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 9 RETURN_VALUE >>> dis.dis(f2) 6 0 LOAD_FAST 0 (a) 3 LOAD_ATTR 0 (__repr__) 6 CALL_FUNCTION 0 9 RETURN_VALUE >>> dis.dis(f3) 9 0 LOAD_FAST 0 (a) 3 UNARY_CONVERT 4 RETURN_VALUE 

f1涉及repr的全局查找, f2__repr__的属性查找,而反引号操作符是在单独的操作码中实现的。 由于没有字典查找( LOAD_GLOBAL / LOAD_ATTR )和函数调用( CALL_FUNCTION )的CALL_FUNCTION ,所以反引号更快。

我想Python的人们认为repr()有一个单独的低级操作是不值得的, repr()和反引号都违反了原理

“应该有一个 – 最好只有一个 – 明显的做法”

所以这个特性在Python 3.0中被删除了。

反引号通常是无用的,并在Python 3中消失了。

为了什么是值得的,这个:

 ''.join(map(repr, xrange(10000000))) 

比我的反向版本稍微快一点。 但担心这可能是一个不成熟的优化。

我的猜测是, num没有定义方法__str__() ,所以str()必须对__repr__进行第二次查找。

反引号直接查找__repr__ 。 如果这是真的,那么使用repr()而不是反引号应该给你相同的结果。