f2py编译的Fortran模块中的垃圾回收

问题描述 投票:0回答:1

[我的问题对于作为外部模块编译(通过f2py)并由Python脚本使用的Fortran模块,垃圾收集是如何工作的(及其工作方式?)>

背景

我目前正在使用有限元程序,大多数情况下是用Python编写的(为方便起见),它使用Fortran子例程的多个模块来执行无法避免某些循环的任务(即切线刚度矩阵的组装/更新)。使用f2py(the quick way)成功编译了该文件,并将生成的.dll文件作为python模块导入到python脚本中。然后可以通过Python成功调用函数/子例程。

Fortran模块的结构如下,不同的子例程使用模块中定义的一些全局变量,并根据需要使用它们自己的伪变量。

module mod
  integer, parameter :: iwp = SELECTED_REAL_KIND(15)
  real(iwp), allocatable, dimension(:,:) :: points, der, matrix, jac, deriv, bee, g_coord
  real(iwp), allocatable, dimension(:) :: fun, disps
  real(iwp), allocatable, dimension(:,:,:) :: tensor
  integer, allocatable, dimension(:,:) :: g_num, g_g
  integer, allocatable, dimension(:) :: etype, weights
  integer :: ndof,nodf,ndim,nels,nip,nod
contains

...subroutines,functions...

全局变量直接从Python脚本中分配和分配为具有正确类型(可能是较差的样式,但对我有用)的F连续numpy数组。 这些可以是相对较大的数组,我想确保在成功完成python脚本后将它们释放。

] >>

欢迎其他任何建议!非常感谢

我的问题是,对于作为外部模块编译(通过f2py)并由Python脚本使用的Fortran模块,垃圾收集如何(以及如何)进行垃圾回收?背景我目前正在使用有限的...

python fortran f2py
1个回答
0
投票

首先,在Fortran中没有垃圾回收。其次,模块数据是相同的全局变量,它具有无限的生存期。没有自动取消分配或完成模块数据。

如果要一次性释放大量数据,请创建一个包含数据的派生类型(结构,类),并为该类型创建最终的子例程(析构函数)。然后,在需要时从Python调用析构函数。或者,创建一个代理Python类,然后从Python类的析构函数中调用Fortran析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.