这是因为True
和False
都是用Python 2.抬起头来全局0
和1
文字只是常数,通过快速数组引用抬头,而全局的 字典 在全局命名空间查找(通过掉落到内建的命名空间):
>>> import dis
>>> def foo():
... a = True
... b = 1
...
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (True)
3 STORE_FAST 0 (a)
3 6 LOAD_CONST 1 (1)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
True
使用LOAD_GLOBAL
字节码查找该值,而使用将该1
字面值复制到堆栈中LOAD_CONST
。
如果您True
和False
当地人 你可以很快速重使他们:
def eSieve(n, True=True, False=False):
m = [True]*(n+1)
for i in xrange(2,int((n)**0.5)+1):
if m[i]:
for j in xrange(i*i,n+1,i):
m[j]=False
return [i for i in xrange(2,n) if m[i]]
为参数分配True
和False
作为默认值会为函数提供与本地名称完全相同的名称。再次使用简化版本:
>>> def bar(True=True, False=False):
... True == False
...
>>> dis.dis(bar)
2 0 LOAD_FAST 0 (True)
3 LOAD_FAST 1 (False)
6 COMPARE_OP 2 (==)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
注意LOAD_FAST
操作码,现在索引与LOAD_CONST
字节码一样;cpython函数中的locals就像字节码常量一样存储在数组中。
通过这种更改,使用布尔值会获胜,尽管优势很小;我的时间:
# n integers globals locals
# 10**1 4.31 µs 4.2 µs 4.2 µs
# 10**2 17.1 µs 17.3 µs 16.5 µs
# 10**3 147 µs 158 µs 144 µs
# 10**4 1.5 ms 1.66 ms 1.48 ms
# 10**5 16.4 ms 18.2 ms 15.9 ms
# 10**6 190 ms 215 ms 189 ms
# 10**7 2.21 s 2.47 s 2.18 s
差别并不大,因为Python布尔值只是一个int
子类。
请注意,在Python 3中,True
并且False
已经成为关键字并且不能再分配给它,因此可以将它们像整数文字一样对待。