这是因为
True和
False都是用Python 2.抬起头来全局
0和
1文字只是常数,通过快速数组引用抬头,而全局的 字典
在全局命名空间查找(通过掉落到内建的命名空间):
>>> import dis>>> def foo():... a = True... b = 1... >>> dis.dis(foo) 20 LOAD_GLOBAL 0 (True) 3 STORE_FAST 0 (a) 36 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) 20 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已经成为关键字并且不能再分配给它,因此可以将它们像整数文字一样对待。



