类似于为什么在 Python3 中使用 True 比使用 1 慢但是我使用的是 pypy3 而不是使用 sum 函数。
def sieve_num(n):
nums = [0] * n
for i in range(2, n):
if i * i >= n: break
if nums[i] == 0:
for j in range(i*i, n, i):
nums[j] = 1
return [i for i in range(2, n) if nums[i] == 0]
def sieve_bool(n):
nums = [False] * n
for i in range(2, n):
if i * i >= n: break
if nums[i] == False:
for j in range(i*i, n, i):
nums[j] = True
return [i for i in range(2, n) if nums[i] == False]
sieve_num(10**8)
需要 2.55 秒,但 sieve_bool(10**8)
需要 4.45 秒,这是一个明显的差异。
我怀疑 [0]*n
在某种程度上比 [False]*n
小并且更适合缓存,但是 PyPy 不支持 sys.getsizeof
和 vmprof 行分析。我能得到的唯一信息是 <listcomp>
for sieve_num
花费了 116 毫秒(占总执行时间的 19%),而 <listcomp>
for sieve_bool
工具花费了 450 毫秒(占总执行时间的 40%)。
使用 PyPy 7.3.1 在英特尔 i7-7700HQ 上实现 Python 3.6.9,在 Ubuntu 20.04 上具有 24 GB 内存。使用 Python 3.8.10 sieve_bool
只是稍微慢一点。