【发布时间】:2015-10-02 00:17:39
【问题描述】:
我正在尝试为我所在领域的一些流行的 Fortran 代码制作 python 包分发。我希望它对setup.py 文件使用最标准的方法。相关问题对学习很有帮助how to wrap Fortran extensions。
在使用这种方法时,我注意到在混合 setuptools 和 numpy.distutils 时会出现一些令人困惑的行为。将两者混合是不好的做法吗?截至 2015 年,似乎最好尽可能使用setuptools。
但是,我想以与numpy. 兼容的方式构建Fortran 扩展,因此我想从numpy.distutils 导入以获取Extension 和setup。
我正在使用以下基本方法:
from setuptools.command.develop import develop
from numpy.distutils.core import Extension, setup
ext_modules=[Extension("my_package.fortran_mod", sources=['src/fortran_mod.f'])]
class MyDevelop(develop):
def run(self):
my_script()
develop.run(self)
setup(
...
ext_modules=ext_modules,
cmdclass={'develop':MyDevelop})
这似乎可行,但我有疑问。
- 将
setuptools和numpy.distribute混合使用通常是一种好习惯吗? - 我导入它们的顺序重要吗?我应该总是先导入
setuptools吗? - 是否有官方最新的打包扩展至
numpy的教程?甚至可能有一些讨论 Fortran 扩展?
一些链接
https://www.youtube.com/watch?v=R4yB-8tB0J0
http://www.fortran90.org/src/best-practices.html#interfacing-with-python
【问题讨论】:
-
我不是包装 Fortran 代码的专家 - 但我对 Cython 非常有经验。来自 Scipy 2015 的 This talk 有一个关于成功包装 Fortran 代码的非常好的部分 - 我建议你看看!
-
标准 Python 是什么意思?
nogil非常重要,如果您希望能够委托给本机代码并使用线程/多进程。您的 MPI 示例是发布 GIL 的最佳时机! -
相比 f2py,Cython 允许你在 Fortran 代码中使用iso_c_binding。因为 f2py 主要是为 Fortran77 代码构建的,它缺乏很多 Fortran90+ 的强大功能,例如动态内存分配。使用 Cython,您拥有更大的灵活性,因为您的 Fortran 和 Cython 代码可以使用 iso_c_binding (几乎是本机)相互交流。
-
继一些早期的 cmets 之后,我想再提供两个选项供您参考。如果您使用“旧”Fortran,那么您可以使用
ctypes直接访问您的 Fortran 函数(只需注意函数名称,根据您的编译器,它会得到一个尾随下划线)。最近我成为了pybind11 的粉丝,它允许您使用 C++ 编写整个 Python 模块,并且具有古老的 Fortran 代码获得现代前端的额外优势。 -
@Will 在进行 Fortran 转换之前,您确定它们还没有在 SciPy 低级 Fortran 接口中实现吗? github.com/scipy/scipy/blob/master/scipy/linalg/blas.py 还有 lapack.py 你很难写出更快的东西(我已经尝试过 MKL 并且只能剃掉可能只有几微秒的时间(即没有统计学上显着的改进))也看看那里他们有一些 prewitten Cython 测试程序(dgemm 确实有一个错误,您可以通过搜索我的 SciPy dgemm interface not working on mx1 1xn vectors 的帖子来解决)
标签: python numpy fortran setuptools f2py