我正在玩列表推导,我在另一个网站上看到了这个小片段:
return ''.join([`num` for num in xrange(loop_count)])
在意识到 `num`
位破坏了它之前,我花了几分钟尝试复制该函数(通过键入)。
在这些字符中包含语句有什么作用?据我所知,它相当于str(num)。但是当我计时时:
return ''.join([str(num) for num in xrange(10000000)])
需要 4.09 秒,而:
return ''.join([`num` for num in xrange(10000000)])
需要 2.43 秒。
两者都给出相同的结果,但一个要慢得多。这是怎么回事?
奇怪... repr()
给出的结果比 `num`
稍慢。 2.99 秒对 2.43 秒。我正在使用 Python 2.6(尚未尝试 3.0)。
最佳答案
反引号是 repr()
的已弃用别名。不要再使用它们了; Python 3.0 中删除了该语法。
在 2.x 版本中,使用反引号似乎比使用 repr(num)
或 num.__repr__()
更快。我猜这是因为分别在全局命名空间(对于 repr
)或对象的命名空间(对于 __repr__
)中需要额外的字典查找。
使用 dis
模块证明了我的假设:
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
) 没有开销,因此反引号更快。
我猜 Python 人认为对 repr()
进行单独的低级操作是不值得的,并且同时使用 repr()
和反引号违反原理
"There should be one-- and preferably only one --obvious way to do it"
所以这个特性在 Python 3.0 中被移除了。
关于python - 反引号对 Python 解释器意味着什么?示例 : `num` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1673071/