对于 PyPy 中的这个筛子,为什么 0/1 比 False/True 快?

问题描述 投票:0回答:0

类似于为什么在 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 只是稍微慢一点。

python performance pypy
© www.soinside.com 2019 - 2024. All rights reserved.