3

我有一个使用 numpy 和 scipy 的 python 程序。在其中添加 cython 将是一个耗时的过程,因为数据类型有很多变化

它的 cprofile 如下所示:http: //imgur.com/a/Sgvof

大部分时间(73%)都被<scipy.integrate_odepack.odeint> 我的问题用完了,使用 cython 是否可以加快这个功能(也许是通过更快的调用)和其余的。在这个例子中,这个函数被调用了 ~10^6 次。如果是这样,我可以期待多少速度?如果速度至少提高 4 到 5 倍,我会考虑这样做

笔记:

如果提供的信息不充分,请在下方评论,我很乐意提供

谢谢

4

2 回答 2

3

您可能不会看到太多(如果有的话)改进。SciPy(更具体地说,您最感兴趣的代码odeint)已经是一个 CPython 模块(用 Fortran 编写),而不仅仅是 python。

如果这是一个仅限 python 的函数调用,那么用 Cython 编写它(这比编写一个完整的 CPython 模块更容易,尽管我个人会编写 ac 或 c++ dll 并使用 ctypes 调用它......)会增加你的表现。但可能不在这种情况下。

于 2012-05-04T11:31:00.783 回答
3

有一半的时间<scipy.integrate_odepack.odeint>花在里面dx_dvdx_du这些看起来像是 python 函数。这些是您可以定位的功能,特别是如果它们很复杂。

需要记住的一件事是,如果减速仅仅是因为这样,calling overhead * number of calls那么我预计情况不会有太大改善。这种开销不会消失,实际上它可能会变得更复杂。你将使用 SciPy C -> Python -> 你的 C 而不是 SciPy C -> Python。

于 2012-05-04T14:49:42.497 回答