python - 反引号对 Python 解释器意味着什么?示例 : `num`

标签 python list-comprehension

我正在玩列表推导,我在另一个网站上看到了这个小片段:

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/

相关文章:

python - 比较列表理解和显式循环(3 个数组生成器比 1 个 for 循环更快)

haskell - 使用或在列表理解中

c# - 如何在 C# 中进行列表理解(将列表转换为另一个列表的紧凑方式)?

python - 尝试通过列表理解来完成这个简单的功能

python - 在 Python 中列出具有任意数量变量的理解?

python - pyunit 的漂亮 html 报告

Python Bokeh : remove toolbar from chart

python - 复合 if elif else 语句 + python

python - 如何使用python flask解决未读结果错误

python - Pandas 区域图插值/步骤样式