【问题标题】:Wrapping a f2py-compiled Fortran .so with Cython (without passing by python)用 Cython 包装 f2py 编译的 Fortran .so(不通过 python 传递)
【发布时间】:2014-03-03 09:00:55
【问题描述】:

看看其他一些类似的问题 (Cython and fortran - how to compile together without f2py),我可能会以错误的方式解决这个问题,但我想实施的工作流程似乎如此 cythonic/pythonic,如果以下内容我会感到惊讶'不可能:

1) 使用包含我需要的 foo 子例程的 fortran_func.f 源文件中的 f2py 编译一个 fortran_func.so。看到我有 .f 源,我确实知道正确的函数调用语法。

2) 魔术步骤可能涉及“cdef extern”或类似的东西。

3) 直接调用函数无需经过:

import fortran_func

out = fortran_func.foo(x, y)

我的想法是我围绕这个函数调用有三个 for 循环,并且通过 python 导入调用 fortran 函数真的很慢。目前我有这个:

import fortran_func

cdef np.ndarray[double, ndim=3] cy_func(double[::1] x,
                                        double[::1] y,
                                        double[::1] z,
                                        int N):
    cdef:
        int i, j, k
        np.ndarray[double, ndim=3] out

    out = np.zeros((N, N, N), dtype=np.float64)

    for i in range(N): # fast C loops
        for j in range(N):
            for k in range(N):
                # extremely slow python call
                out[i,j,k] = fortran_func.foo(x[i], y[j], z[k])

                # would prefer a fast, direct function call
                # out[i,j,k] = foo(x[i], y[j], z[k])

我非常感谢任何帮助找出这个神奇的步骤应该是什么!

【问题讨论】:

  • 我认为在fortran90.org 与 Python 交互的过程正是您所寻找的。​​span>

标签: python cython f2py


【解决方案1】:

您可以使用 ctypes 将共享的 fortran 对象作为 c 函数调用,而无需转换为 python 类型。您应该也可以使用 cython 来做到这一点。我写在这里:

http://pythology.blogspot.fr/2014/03/wrapping-fortran-and-python-without-f2py.html

这是摘要:

fortran 文件添加.f95:

subroutine add(a,b,c)    
    implicit none
    integer a,b,c
    c = a + b 
end

编译:

gfortran -shared -fPIC add.f95 -o add.so

调用它的python代码(小心,'add'变成'add_')是:

#!/usr/bin/env python

from ctypes import c_int, byref, cdll

a = c_int(3)
b = c_int(4)
c = c_int()

addlib = cdll.LoadLibrary('./add.so')
addlib.add_(byref(a),byref(b),byref(c))
print c

【讨论】:

  • 我认为它仍然可以工作,尽管它就像一个只指向一些代码的 python 对象。因此,出于 cython 的目的(我认为),它会像 f2py 解决方案一样慢......
  • 如果您使用 ctypes 是的,但是如果您将其作为外部 c 函数直接导入 cython,您的 python 代码甚至都不知道它的 fortran!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多