Dom*_*mra 81 python list-comprehension
我正在玩列表推导,我在另一个网站上看到了这个小片段:
return ''.join([`num` for num in xrange(loop_count)])
Run Code Online (Sandbox Code Playgroud)
我花了几分钟试图复制这个函数(通过输入),然后才意识到`num`它正在破坏它.
在这些字符中包含语句的内容是什么?从我所看到的它相当于str(num).但是当我计时:
return ''.join([str(num) for num in xrange(10000000)])
Run Code Online (Sandbox Code Playgroud)
它需要4.09s而:
return ''.join([`num` for num in xrange(10000000)])
Run Code Online (Sandbox Code Playgroud)
需要2.43秒.
两者都给出了相同的结果,但其中一个慢得多.这里发生了什么?
编辑:奇怪... repr()给出稍微慢一点的结果`num`.2.99s vs 2.43s.使用Python 2.6(尚未尝试过3.0).
Fer*_*yer 118
反引号是一个不推荐使用的别名repr().不要再使用它们了,在Python 3.0中删除了语法.
使用反引号似乎比使用repr(num)或num.__repr__()版本2.x 更快.我想这是因为在全局命名空间(for repr)或对象的命名空间(for __repr__)中分别需要额外的字典查找.
使用该dis模块证明了我的假设:
def f1(a):
return repr(a)
def f2(a):
return a.__repr__()
def f3(a):
return `a`
Run Code Online (Sandbox Code Playgroud)
拆卸显示:
>>> 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
Run Code Online (Sandbox Code Playgroud)
f1涉及全局查找repr,f2属性查找__repr__,而反引号运算符在单独的操作码中实现.由于字典查找(LOAD_GLOBAL/ LOAD_ATTR)和函数调用(CALL_FUNCTION)没有开销,因此反引号更快.
我想Python人们认为单独进行低级操作repr()是不值得的,并且使用repr()和反对都违反了原则
"应该有一个 - 最好只有一个 - 明显的做法"
所以在Python 3.0中删除了该功能.
反引用引用通常是无用的,并且在Python 3中使用.
对于它的价值,这个:
''.join(map(repr, xrange(10000000)))
Run Code Online (Sandbox Code Playgroud)
比我的反引号版本略快.但担心这可能是一个不成熟的优化.
| 归档时间: |
|
| 查看次数: |
29733 次 |
| 最近记录: |