使用f2py更新Python GUI中长期运行的Fortran子例程

使用f2py更新Python GUI中长期运行的Fortran子例程,python,fortran,wxpython,f2py,Python,Fortran,Wxpython,F2py,我有一个pythongui(wxPython),它使用f2py封装了一个fortran“后端”。有时,fortran进程可能会运行很长时间,我们希望在GUI中放置一个进度条,通过fortran例程更新进度。是否有任何方法可以在不涉及文件I/O的情况下获取Fortran例程的状态/进度?如果您对代码的哪些部分花费的时间最多有基本的了解,您可以包括进度指示器。考虑下面的示例代码: program main implicit none integer, parameter :: N = 100000

我有一个pythongui(wxPython),它使用f2py封装了一个fortran“后端”。有时,fortran进程可能会运行很长时间,我们希望在GUI中放置一个进度条,通过fortran例程更新进度。是否有任何方法可以在不涉及文件I/O的情况下获取Fortran例程的状态/进度?

如果您对代码的哪些部分花费的时间最多有基本的了解,您可以包括进度指示器。考虑下面的示例代码:

program main
implicit none
integer, parameter :: N = 100000
integer :: i
real, allocatable :: a(:), b(:)

! -- Initialization
write(*,*) 'FORFTP: Beginning routine'

allocate(a(N), b(N))
a = 0.
b = 0.

write(*,*) 'FORFTP: Completed initialization'

do i=1,N
   call RANDOM_NUMBER(a(i))
   b(i) = exp(a(i))     ! Some expensive calculation

   if (mod(i,N/100)==0) then     ! -- Assumes N is evenly divisible by 100
      write(*,*) 'FORFTP: completed ', i*100/N, ' percent of the calculation'
   endif
enddo

write(*,*) 'FORFTP: completed routine'

end program main
然后,用户将在初始化后以及完成“昂贵计算”的每一个百分比后获得更新

我不知道
f2py
是如何工作的,但我假设python可以通过某种方式读取fortran在运行时输出的内容,并将其显示在gui中。在本例中,任何标记为
FORFTP
的内容都将在gui中输出,我使用的是标准输出

不过,这个例子说明了调查进展的问题。与计算相比,很难理解分配需要多少时间。例如,很难说初始化占总执行时间的15%

然而,即使他们没有一个精确的进度表,对正在发生的事情进行更新仍然是有用的

编辑 该例程提供以下输出:

 >  pgfortran main.f90
 >  ./a.out 
 FORFTP: Beginning routine
 FORFTP: Completed initialization
 FORFTP: completed             1  percent of the calculation
 FORFTP: completed             2  percent of the calculation
  ...
 FORFTP: completed            99  percent of the calculation
 FORFTP: completed           100  percent of the calculation
 FORFTP: completed routine

如果您知道每项任务大约需要多长时间,那么最简单的选择是根据任务开始后经过的时间(根据任务的预期持续时间进行衡量)来确定进度,这很有可能被否决。
为了保持相关性,您可以始终存储每次任务的运行持续时间,并使用该时间或平均时间作为基准时间线。

有时候,我们会把事情复杂化;)

首先,您必须了解fortran例程中花费了很长时间的内容。您是否分析过fortran代码以了解代码在哪里花费了很长时间?另外,为什么您不热衷于使用文件I/O?一个简单的调试语句或进度输出是跟踪进度的常用方法…@Ross这只是一个漫长的过程。我不是在尝试评测/调试,我想在我的GUI中放一个进度条,向用户显示它将运行多长时间。如果不清楚,请道歉。我不喜欢添加文件I/O,因为它增加了开销,但这当然是我目前唯一的选择。但是您需要配置文件,并且您需要某种方式来发送有关您目前在tye代码中实际位置的消息。我的2个理由:算了吧,这可能比你想象的要多得多。我同意@VladimirF-如果你不知道内部代码计时是什么样的,你怎么知道你的进度?我想你可以用一些启发式的方法进行先验猜测,但这听起来不是很好。顺便说一句,除非输出大量数据,否则I/O不会很重。我说的是一个简单的
完成的第1步(共5步)
“给定运行上的循环可能是几千次迭代,或2000万次迭代。在2000万次迭代中,这可能需要数小时或数天的时间来运行。因此,我基本上只想告诉Python GUI后端在哪个循环迭代上。”情况似乎并非如此。