我想绘制一个涉及二项式系数的函数。我的代码是
#!/usr/bin/python
from __future__ import division
from scipy.special import binom
import matplotlib.pyplot as plt
import math
max = 500
ycoords = [sum([binom(n,w)*sum([binom(w,k)*(binom(w,k)/2**w)**(4*n/math.log(n)) for k in xrange(w+1)]) for w in xrange(1,n+1)]) for n in xrange(2,max)]
xcoords = range(2,max)
plt.plot(xcoords, ycoords)
plt.show()
不幸的是,这永远不会终止。如果你将max减少到40说它工作正常。有没有办法绘制这个函数?
我也担心scipy.special.binom可能没有提供准确的答案,因为它似乎在浮点工作。
答案 0 :(得分:3)
使用numpy计算内部循环可以获得显着的加速。首先将max
更改为N
(因为max
是内置的)并将您的功能分解为更小,更易于管理的块:
N = 500
X = np.arange(2,N)
def k_loop(w,n):
K = np.arange(0, w+1)
return (binom(w,K)*(binom(w,K)/2**w)**(float(n)/np.log(n))).sum()
def w_loop(n):
v = [binom(n,w)*k_loop(w,n) for w in range(1,n+1)]
return sum(v)
Y = [w_loop(n) for n in X]
使用N=300
作为测试,3.932s
使用numpy代码,81.645s
使用旧代码。我甚至没有计算N=500
案例,因为你的旧代码花了这么长时间!
值得指出的是,你的函数基本上是指数增长,可以近似。您可以在semilogx
图中看到这一点: