列表理解与重复计算
List comprehension with repeated computation
我目前正在研究 Python 中的 Project Euler 问题 53。解决方案非常简单,但涉及以下列表理解:
[scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1)
for r in range(0,n+1)
if scipy.misc.comb(n, r, exact=True) > threshold]
我担心的是 scipy.misc.comb() 函数每次迭代都会被调用两次。有没有办法用某种参考来代替它的一次或多次出现?或者,解释器是否足够聪明,可以意识到这两个实例的计算结果相同?
您可以将 scipy.misc.comb()
函数放入生成器表达式中:
[comb for comb in
(scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1) for r in range(0,n+1))
if comb > threshold]
生成器每次迭代只计算一次。
将生成器表达式放入一个单独的变量中可能会使这一点更清楚:
calculated = (scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1) for r in range(0,n+1))
[comb for comb in calculated if comb > threshold]
将其视为传送带; calculated
生成器仅在列表理解对其进行迭代时生成其输出。
我目前正在研究 Python 中的 Project Euler 问题 53。解决方案非常简单,但涉及以下列表理解:
[scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1)
for r in range(0,n+1)
if scipy.misc.comb(n, r, exact=True) > threshold]
我担心的是 scipy.misc.comb() 函数每次迭代都会被调用两次。有没有办法用某种参考来代替它的一次或多次出现?或者,解释器是否足够聪明,可以意识到这两个实例的计算结果相同?
您可以将 scipy.misc.comb()
函数放入生成器表达式中:
[comb for comb in
(scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1) for r in range(0,n+1))
if comb > threshold]
生成器每次迭代只计算一次。
将生成器表达式放入一个单独的变量中可能会使这一点更清楚:
calculated = (scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1) for r in range(0,n+1))
[comb for comb in calculated if comb > threshold]
将其视为传送带; calculated
生成器仅在列表理解对其进行迭代时生成其输出。