大佬教程收集整理的这篇文章主要介绍了为什么我的Eratosthenes筛网使用整数比使用布尔值更快?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是因为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
已经成为关键字并且不能再分配给它,因此可以将它们像整数文字一样对待。
我写了一个简单的Eratosthenes筛子,它使用一个列表,如果不是素数,则将它们变成零,就像这样:
def eSieve(n): #Where m is fixed-length list of all Integers up to n
'''Creates a list of primes less than or equal to n'''
m = [1]*(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]=0
return [i for i in xrange(2,n) if m[i]]
我测试了它的运行速度%timeit
并得到:
#n: t
#10**1: 7 μs
#10**2: 26.6 μs
#10**3: 234 μs
#10**4: 2.46 ms
#10**5: 26.4 ms
#10**6: 292 ms
#10**7: 3.27 s
我认为,如果我改变[1]
和0
对布尔型,它会跑得更快......但它确实相反:
#n: t
#10**1: 7.31 μs
#10**2: 29.5 μs
#10**3: 297 μs
#10**4: 2.99 ms
#10**5: 29.9 ms
#10**6: 331 ms
#10**7: 3.7 s
为什么布尔变量变慢?
以上是大佬教程为你收集整理的为什么我的Eratosthenes筛网使用整数比使用布尔值更快?全部内容,希望文章能够帮你解决为什么我的Eratosthenes筛网使用整数比使用布尔值更快?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。