相关疑难解决方法(0)

为什么`for`循环这么快才能计算True值?

我最近在一个姐妹网站上回答了一个问题,问题要求一种功能来计算数字的所有偶数位。其中的其他的答案中包含两个功能(这被证明是最快的,至今):

def count_even_digits_spyr03_for(n):
    count = 0
    for c in str(n):
        if c in "02468":
            count += 1
    return count

def count_even_digits_spyr03_sum(n):
    return sum(c in "02468" for c in str(n))
Run Code Online (Sandbox Code Playgroud)

另外,我还研究了使用列表理解和list.count

def count_even_digits_spyr03_list(n):
    return [c in "02468" for c in str(n)].count(True)
Run Code Online (Sandbox Code Playgroud)

前两个函数基本相同,除了第一个函数使用显式的计数循环,而第二个函数使用内建的sum。我本来希望第二个更快(基于此答案),这是我建议将第二个变成要求审查的东西。但是,事实证明是相反的。用一些数字递增的随机数对其进行测试(因此,任何一位数字的偶数概率约为50%),我得到以下计时:

在此处输入图片说明

为什么手动for循环这么快?比使用快将近两倍sum。而且由于内置功能sum应该比手动汇总列表大约快五倍(根据链接的答案),这意味着它实际上要快十倍!是否因为只需要将一半的​​值添加到计数器而节省了费用,因为另一半被丢弃了,足以说明这种差异?


使用if像这样的过滤器:

def count_even_digits_spyr03_sum2(n):
    return sum(1 for c in str(n) if c in "02468") …
Run Code Online (Sandbox Code Playgroud)

python performance for-loop sum python-3.x

53
推荐指数
4
解决办法
3512
查看次数

标签 统计

for-loop ×1

performance ×1

python ×1

python-3.x ×1

sum ×1