python - 区间优化搜索

标签 python optimization micro-optimization

我的目标是使用给定的算法找到特定分布的概率密度函数。

这个算法要求我搜索一个浮点放在哪个区间。即使代码运行得很好,但时间太长了。我一直在寻找一种优化代码的方法,但没有想到。

在每次迭代中,我都会检查 float 是否在区间内:如果是这样,我希望在数组 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 由区间 [0, 1] 内均匀分布的 len(y) 个数字组成,这也是 Y 的范围> 值,我们不需要在 intervals 中搜索 j 的位置,而是可以计算它。

    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)]

关于python - 区间优化搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66843630/

相关文章:

python - 使用 c_iso_binding 和 cython 用 fortran 创建一个 python 包

python - 使用 Python 从 SFTP 服务器下载超过 5 天的文件

c - 如何优化这段代码?

c++ - 如何优化 C++ avr 代码

Python 应用程序崩溃并出现错误 "ImportError: pyexpat.x86_64-linux-gnu.so: undefined symbol: XML_SetHashSalt"

pygame 中用于 MVC 事件处理的 Python 鸭子类型(duck typing)

c++ - 编译器优化以获得最快的代码

javascript - 高效声明 JavaScript 变量

performance - 现代CPU保持标志更新是否需要花费大量资源?

python - 为什么 `arr.take(idx)` 比 `arr[idx]` 快