【发布时间】: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>