栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么我的Eratosthenes筛网使用整数比使用布尔值更快?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么我的Eratosthenes筛网使用整数比使用布尔值更快?

这是因为

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
已经成为关键字并且不能再分配给它,因此可以将它们像整数文字一样对待。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/626096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号