<p>我在我的机器上从~7秒变为~3秒:</p>
<ul>
<li>为每个值预先计算<code>i * (3 * i - 1 ) / 2</code>,在你的计算中,它被计算了两次</li>
<li>对quickCheck的缓存调用</li>
<li>通过向范围中添加+1删除了<code>if i == g</code></li>
<li>删除<code>if p_i > p_g</code>,因为p<em>总是</em>小于p<g</li>
</ul>
<p>同时将quickCheck函数放在main中,使所有变量都成为局部变量(比全局变量查找速度更快)。
我相信还有更多的微优化可用。在</p>
<pre><code>def main():
maxNumber = 5000
diff = 1000
p = {}
quickCache = {}
for i in range(maxNumber):
p[i] = i * (3 * i - 1 ) / 2
def quickCheck(n):
if n in quickCache: return quickCache[n]
partial_c = (sqrt(1 + 24 * (n)))/-6
c = 1/6 + partial_c
if int(c.real) == c.real:
quickCache[n] = True
return True
c = c - 2*partial_c
if int(c.real) == c.real:
quickCache[n] = True
return True
quickCache[n] = False
return False
for i in range(1, maxNumber):
mi = p[i]
for g in range(i+1, maxNumber):
ma = p[g]
if ma - mi < diff and quickCheck(ma - mi) and quickCheck(ma + mi):
print('New couple ', ma, mi)
diff = ma - mi
</code></pre>