Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyPy或Cython使用fsolve加速循环?_Python_Python 3.x_Numpy_Pypy_Scipy Optimize - Fatal编程技术网

Python 使用PyPy或Cython使用fsolve加速循环?

Python 使用PyPy或Cython使用fsolve加速循环?,python,python-3.x,numpy,pypy,scipy-optimize,Python,Python 3.x,Numpy,Pypy,Scipy Optimize,我有一个Python脚本,其中包含一个循环,其中包含大量对scipy.optimize.fsolve的调用(每个时间步99(55+54)次,现在我需要大约10^5个时间步)。脚本的其余部分也不是很快,但从Spyder Profiler的输出来看,调用fsolve是迄今为止最耗时的。根据我目前的设置,运行脚本需要10个多小时,所以我可以稍微加快速度 根据我在这里和互联网上其他地方读到的内容,我已经给了PyPy一次尝试:在conda(MacOS 10.15.5、PyPy 7.3.1和PyPy 3.6

我有一个Python脚本,其中包含一个循环,其中包含大量对scipy.optimize.fsolve的调用(每个时间步99(55+54)次,现在我需要大约10^5个时间步)。脚本的其余部分也不是很快,但从Spyder Profiler的输出来看,调用fsolve是迄今为止最耗时的。根据我目前的设置,运行脚本需要10个多小时,所以我可以稍微加快速度

根据我在这里和互联网上其他地方读到的内容,我已经给了PyPy一次尝试:在conda(MacOS 10.15.5、PyPy 7.3.1和PyPy 3.6 7.3.1)下的单独环境中安装它,以及它自己的numpy、scipy和pandas版本,但到目前为止,它实际上比Python慢了一点(195秒对171秒,100个时间步)

从我所读到的(PyPy Status博客,10月17日),这可能与使用numpy而不是numpy有关,和/或与重复分配临时数组有关。除了调用fsolve 1000多万次之外,我还使用了相当多的numpy数组,所以就我所知这是有意义的

问题是,我不是一名开发人员,而且我对PyPy完全是新手,所以像JIT跟踪这样的术语对我来说意义不大,而对我来说,破解它们中的内容可能会是一个挑战。此外,2017年10月的情况现在可能不再适用。此外,即使我设法加快了numpy数组位的速度,我仍然不能确定fsolve部分

有人能指出我是否值得花时间在PyPy上吗?还是Cython更适合这种情况?甚至是4便士

如果这有帮助的话,我很乐意与大家分享我的代码,但是它包含了一个800多行代码的模块,所以在这篇文章中包含它对我来说并不是一个好主意

非常感谢! 锡塔

编辑:感谢大家快速、友好的回复!这是一个公平的观点,关于需要查看我的代码,我把它(链接有效期至2020年6月19日)。artheral_1D.py是模块,CoronaryTree.py是调用artheral_1D.py的脚本。作为一个简单的工作示例,我额外添加了一行,在这种情况下不加注释(在代码中明确标记)。此外,我将时间步数设置为100,以使代码在合理的时间内运行(在我的示例中,最小示例为0.61秒,完整冠状动脉树为37.3秒)


编辑2:我真傻,在我的原始帖子中,我提到了197和171年代分别使用PyPy和Python运行100步代码,但在这种情况下,我从pypypy环境中调用了Python,所以它使用的是pypypy版本的Numpy。在我的基本环境中,运行100个步骤需要30秒多一点。因此,在这种情况下,PyPy比Python慢得多,这促使我研究这篇PyPy状态博客文章。

如果不查看代码,我们就无法真正帮助您进行优化。但是,既然你有相当多的描述在那里进行,让我回答我认为你可以尝试加快事情的进展

第一件事就是第一件事。Scipy库。 从scipy.optimize.fsolve的源代码中,它介绍了MINPACK的hybrd和hybrj算法,它们是相当快的FORTRAN子程序。因此,在您的情况下,切换到PyPy不会有多大好处,如果有任何好处的话

如何优化Scipy fsolve?最明显的数值方法之一是将函数的参数矢量化。但似乎您正在运行一种时间步算法,而大多数标准的时间步算法无法在时间上进行矢量化。如果你的“XX倍每时间步”是一种隐式空间循环每一个时间步长(即你的网格),你可以考虑矢量化,以实现一些速度的增益。下一步是放大函数的猜测/起始根估计。看看你是否可以修改你的算法,在整个时间间隔内利用一个好的开始解决方案(做一些文献挖掘)。请注意,这和“编程”的关系要比你们对数值方法的了解小得多

接下来,在您对“脚本的其余部分也不是很快”的评论中,好吧,我会和Cython一起努力完成代码的其余python部分,尤其是循环。这是一个非常积极的开发,伟大的社区,并且经过了战斗的考验。我个人在许多HPC类型的问题中使用过它。Cython还有一个方便的html注释,它突出显示了在本机python实现上可能进行的潜在优化


希望这有帮助!干杯

如果不查看代码,我们无法真正帮助您进行优化。但是,既然你有相当多的描述在那里进行,让我回答我认为你可以尝试加快事情的进展

第一件事就是第一件事。Scipy库。 从scipy.optimize.fsolve的源代码中,它介绍了MINPACK的hybrd和hybrj算法,它们是相当快的FORTRAN子程序。因此,在您的情况下,切换到PyPy不会有多大好处,如果有任何好处的话

如何优化Scipy fsolve?最明显的数值方法之一是将函数的参数矢量化。但似乎您正在运行一种时间步算法,而大多数标准的时间步算法无法在时间上进行矢量化。如果你的“XX倍每时间步”是一种隐式空间循环每一个时间步长(即你的网格),你可以考虑矢量化,以实现一些速度的增益。下一步是放大函数的猜测/起始根估计。看看你是否可以修改你的算法,在整个时间间隔内利用一个好的开始解决方案(做一些文献挖掘)。请注意,这和“编程”的关系要比你们对数值方法的了解小得多

接下来,在您对“脚本的其余部分也不是很快”的评论中