首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在构建numpy源代码时,f2py用于什么?

在构建numpy源代码时,f2py用于什么?
EN

Stack Overflow用户
提问于 2014-05-14 22:16:09
回答 2查看 761关注 0票数 6

当我在NumPy的源树中列出所有Fortran文件时,我得到:

代码语言:javascript
复制
./doc/source/f2py/scalar.f
./doc/source/f2py/string.f
./doc/source/f2py/calculate.f
./doc/source/f2py/moddata.f90
./doc/source/f2py/array.f
./doc/source/f2py/allocarr.f90
./doc/source/f2py/extcallback.f
./doc/source/f2py/common.f
./doc/source/f2py/ftype.f
./doc/source/f2py/fib3.f
./doc/source/f2py/callback.f
./doc/source/f2py/fib1.f
./doc/f2py/f2python9-final/src/examples/exp1.f
./doc/f2py/simple.f
./doc/f2py/multiarray/foo.f
./doc/f2py/hello.f
./doc/f2py/ex1/bar.f
./doc/f2py/ex1/foobar-smart.f90
./doc/f2py/ex1/foo.f
./doc/f2py/ex1/arr.f
./doc/f2py/ex1/foobar.f90
./numpy/f2py/tests/src/mixed/foo_fixed.f90
./numpy/f2py/tests/src/mixed/foo_free.f90
./numpy/f2py/tests/src/mixed/foo.f
./numpy/f2py/tests/src/size/foo.f90
./numpy/f2py/tests/src/kind/foo.f90
./numpy/f2py/tests/src/assumed_shape/precision.f90
./numpy/f2py/tests/src/assumed_shape/foo_use.f90
./numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap
./numpy/f2py/tests/src/assumed_shape/foo_free.f90
./numpy/f2py/tests/src/assumed_shape/foo_mod.f90
./numpy/f2py/src/test/bar.f
./numpy/f2py/src/test/foo.f
./numpy/f2py/src/test/foo90.f90
./numpy/f2py/src/test/wrap.f
./numpy/distutils/tests/f2py_ext/src/fib1.f
./numpy/distutils/tests/f2py_f90_ext/include/body.f90
./numpy/distutils/tests/f2py_f90_ext/src/foo_free.f90

因此,除了f2py本身,没有其他人使用Fortran。我研究了线性代数模。对于LAPACK,有一个make_lite.py文件,它只从LAPACK源树中提取必要的子例程,并使用f2c将它们转换为C。那么,在创建NumPy的确切时间,创建f2py是否方便呢?我是不是遗漏了什么?

编辑

结果发现,SciPy中的许多包都使用f2py。正在运行

代码语言:javascript
复制
$ find . -iname '*.f*'  | cut -d'/' -f3,4 | uniq

给出填充了Fortran文件的确切目录:

代码语言:javascript
复制
linalg/src
fftpack/src
odr/odrpack
special/cdflib
special/amos
special/mach
special/specfun
integrate/quadpack
integrate/odepack
integrate/dop
integrate/linpack_lite
integrate/mach
sparse/linalg
interpolate/fitpack
optimize/minpack2
optimize/minpack
optimize/nnls
optimize/cobyla
optimize/lbfgsb
optimize/slsqp
stats/mvndst.f
stats/futil.f
stats/statlib
_build_utils/src
lib/lapack
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-15 01:05:09

好吧,经过一番周旋,我想我已经证实了我最初的一些怀疑

第一:

因此,除了f2py本身,没有其他人使用Fortran。

正如我在注释中提到的,OP所引用的所有Fortran源文件都位于/test//doc/目录中,因此我怀疑它们用于测试和记录f2py (以及使用f2pynumpy.distutils )。看一眼几个源文件就可以证实这一点。f2py本身看起来像是用Python和C编写的。

我研究了线性代数模。对于LAPACK,有一个make_lite.py文件,它只从LAPACK源树中提取必要的子例程,并使用f2c将它们转换为C。

这对我来说很奇怪,因为我实际上没有安装f2c (或者Plex,这是make_lite.py似乎需要的另一个库)。我决定在main()中增加一行,以显示在正常安装过程中是否实际使用了make_lite.py

代码语言:javascript
复制
...
def main():

    # let's see if you're actually doing anything
    import subprocess; subprocess.call(['touch', '/tmp/hello_from_make_lite'])
...

当然,在一个干净的虚拟主机中安装numpy之后,我的/tmp/中没有/tmp/文件,这表明make_lite.main()从未执行过。看看numpy/linalg/lapack_lite/README

numpy/linalg/blas_lite.cnumpy/linalg/dlapack_lite.cnumpy/linalg/zlapack_lite.c是LAPACK模块所需并由lapack_lite模块包装的LAPACK例程的f2c'd版本。该目录中的脚本可用于从LAPACK源文件目录自动创建这些文件。

因此,numpy已经与这些f2c'd源文件一起分发了--除非您希望从新版本的LAPACK库中更新这些函数,否则不需要使用make_lite.py

那么,在创建NumPy的确切时间,创建f2py是否方便呢?

据我所知,在正常的numpy安装过程中,f2py根本不被使用。再次,我在f2py2e.main()中插入了一条额外的行

代码语言:javascript
复制
...
def main():
    import subprocess; subprocess.call(['touch', '/tmp/hello_from_f2py2e'])
...

同样,在正常安装numpy之后,/tmp/hello_from_f2py2e也不存在。

那么,f2py实际上用于什么呢?检查the源树,并从它的根调用。

代码语言:javascript
复制
$ find . -iname *.f*

您将看到大量看起来很重要的Fortran文件,包括fftpackodepackarpackfitpack等。我怀疑f2py主要是需要包装Fortran扩展名才能用于scipy而不是numpy。

不过,我可能错了--也许其中一个矮胖或粗野的神甫会让我改过自新。

更新

实际上,我认为f2py实际上也不需要在正常安装过程中使用!如果您查看一个Fortran模块(例如fftpack )的源目录,就会发现它已经包含了.pyf文件,这些文件通常由f2py自动生成,并为Fortran函数定义接口(参见这里)。

我认为f2py最初用于为Fortran函数生成.pyf包装器,但这些.pyf文件与源树的其余部分一起分发,因此在正常构建过程中没有必要再次运行f2py

票数 3
EN

Stack Overflow用户

发布于 2021-02-16 22:59:38

这是一个老问题,但f2py的目的是允许numpy用户包装自己的任意Fortran例程,并在Python中调用它们。我用它来调用一些自定义卡尔曼滤波器代码。调用Fortran版本比转换为numpy的相同算法要快得多,这可能是由于一组数组切片造成的。然而,随着numba的好转,我更倾向于用@njit来修饰numpy代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23666091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档