我已经为蒙特卡罗模拟拟合了一系列 SciPy 连续分布,并且希望从这些分布中获取大量样本。但是,我希望能够获取相关样本,以便第ith 个样本从每个分布中获取例如第 90 个百分位数。
在这样做时,我发现了 SciPy 性能的一个怪癖:
# very fast way to many uncorrelated samples of length n
for shape, loc, scale, in distro_props:
sp.stats.norm.rvs(*shape, loc=loc, scale=scale, size=n)
# verrrrryyyyy slow way to take correlated samples of length n
correlate = np.random.uniform(size=n)
for shape, loc, scale, in distro_props:
sp.stats.norm.ppf(correlate, *shape, loc=loc, scale=scale)
Run Code Online (Sandbox Code Playgroud)
大多数关于此的结果都声称这些 SciPy 发行版的缓慢,如果来自类型检查等包装。但是,当我分析代码时,大部分时间都花在了底层数学函数[_continuous_distns.py:179(_norm_pdf)]1 上。此外,它与 缩放n,这意味着它在内部循环遍历每个元素。
rv_continuous 上的 SciPy文档几乎似乎暗示子类应该为了性能而覆盖它,但我会猴子补丁到 SciPy 以加速他们的 ppf 似乎很奇怪。我只是根据 ppf 公式计算法线,但我也使用对数正态和偏斜正态,这更难实现。
那么,在 Python …
存储从命令行传递给Java程序的全局设置的最佳方法是什么?例如,如果您要运行,>Java myProgram -verbose我希望能够知道是否在所有私有函数中指定了详细信息.为每个函数添加五个或十个参数只是为了传递必要的变量是错误的,但我也一直在阅读Java中的全局变量是魔鬼的工作,即使它们只设置一次.这一定是一个非常普遍的问题,但我找不到任何可以解释最佳处理方法的东西,如果有人能指出我正确的方向,我会很感激.