搜索区间优化
Search of interval optimization
我的目标是使用给定的算法找到特定分布的概率密度函数。
这个算法要求我搜索一个float放在哪个区间。尽管代码运行完美,但耗时太长。我一直在寻找优化代码的方法,但想到了 none。
在每次迭代中,我检查浮点数是否在区间内:如果是这样,我希望在数组 p 中对我正在考虑的位置进行统一。
这是我的代码:
import numpy as np
import pylab as plt
import random as rd
n = [10,100,1000]
N = [10**6]
dy = 0.005
k_max = int(1/dy-1)
y = np.array([(j+0.5)*dy for j in range(k_max+1)])
intervals = np.linspace(0,1,k_max+2)
def p(y,n,N):
p = np.zeros(len(y))
Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])
z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])
for j in Y:
for i in range(len(y)-1):
if intervals[i] <= j < intervals[i+1]:
p[i] += 1
return(p/(dy*N))
for a in n:
pi = p(y,a,N[0])
plt.plot(y,pi,label = 'n = ' + str(a))
plt.title('Probability Density Function')
plt.xlabel('x')
plt.ylabel('p(x)')
plt.show()
编辑: 我已经按照要求添加了完整的代码。
编辑 2: 修复了错误间隔。
可以在此处进行快速简单的优化:
for j in Y:
for i in range(len(y)-1):
if intervals[i] <= j < intervals[i+1]:
p[i] += 1
由于 intervals
由 len(y)
个均匀分布的数字组成 [0, 1],这也是 Y
值的范围,我们不需要搜索的位置j
在 intervals
中,但我们可以计算它。
for j in Y: p[int(j*(len(y)-1))] += 1
我们也可以删除未使用的
z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])
剩余执行时间的绝大部分被
占用
Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])
这里到np.array
的内部转换非常耗时;最好将它们全部排除在外:
Y = [sum([rd.random() for k in range(n)])/n for j in range(N)]
我的目标是使用给定的算法找到特定分布的概率密度函数。
这个算法要求我搜索一个float放在哪个区间。尽管代码运行完美,但耗时太长。我一直在寻找优化代码的方法,但想到了 none。
在每次迭代中,我检查浮点数是否在区间内:如果是这样,我希望在数组 p 中对我正在考虑的位置进行统一。
这是我的代码:
import numpy as np
import pylab as plt
import random as rd
n = [10,100,1000]
N = [10**6]
dy = 0.005
k_max = int(1/dy-1)
y = np.array([(j+0.5)*dy for j in range(k_max+1)])
intervals = np.linspace(0,1,k_max+2)
def p(y,n,N):
p = np.zeros(len(y))
Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])
z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])
for j in Y:
for i in range(len(y)-1):
if intervals[i] <= j < intervals[i+1]:
p[i] += 1
return(p/(dy*N))
for a in n:
pi = p(y,a,N[0])
plt.plot(y,pi,label = 'n = ' + str(a))
plt.title('Probability Density Function')
plt.xlabel('x')
plt.ylabel('p(x)')
plt.show()
编辑: 我已经按照要求添加了完整的代码。 编辑 2: 修复了错误间隔。
可以在此处进行快速简单的优化:
for j in Y:
for i in range(len(y)-1):
if intervals[i] <= j < intervals[i+1]:
p[i] += 1
由于 intervals
由 len(y)
个均匀分布的数字组成 [0, 1],这也是 Y
值的范围,我们不需要搜索的位置j
在 intervals
中,但我们可以计算它。
for j in Y: p[int(j*(len(y)-1))] += 1
我们也可以删除未使用的
z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])
剩余执行时间的绝大部分被
占用 Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])
这里到np.array
的内部转换非常耗时;最好将它们全部排除在外:
Y = [sum([rd.random() for k in range(n)])/n for j in range(N)]