返回顶部

我最近在一个姊妹网站上回答了一个问题,该问题要求一个计算数字所有偶数位的函数。其中的其他的答案中包含两个功能(这被证明是最快的,至今): 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)) 此外,我查看了使用列表理解和list.count: def count_even_digits_spyr03_list(n): return [c in "02468" for c in str(n)].count(True) 前两个函数基本相同,只是第一个使用显式计数循环,而第二个使用内置的sum. 我本来希望第二个更快(基于例如这个答案),如果要求进行审查,我会建议将前者变成。但是,事实证明情况正好相反。用一些数字增加的随机数对其进行测试(因此任何一位数为偶数的几率约为 50%),我得到以下时间: 在此处输入图片说明 为什么手动for循环要快得多?它几乎比使用sum. 而且由于内置的sum应该比手动对列表求和(根据链接的答案)快五倍左右,这意味着它实际上快十倍!由于另一半被丢弃,因此只需将一半的值添加到计数器中的节省是否足以解释这种差异? 使用 aif作为过滤器,如下所示: def count_even_digits_spyr03_sum2(n): return sum(1 for c in str(n) if c in "02468") 仅将计时提高到与列表理解相同的水平。 当将时间扩展到更大的数字并归一化到for循环时间时,它们对于非常大的数字(> 10k 位)渐近收敛,这可能是由于需要的时间str(n):

正在加载...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152