0

我正在读取一个包含 512**3 个数据点的单精度数据的文件。基于一个阈值,我为每个点分配一个 1 或 0 的标志。我编写了两个程序做同样的事情,一个在 fortran 中,另一个在 python 中。但是 fortran 中的一个需要 0.1 秒,而 python 中的一个需要几分钟。正常吗?或者您能否指出我的python程序的问题:

fortran.f

  program vorticity_tracking

  implicit none

  integer, parameter :: length = 512**3
  integer, parameter :: threshold = 1320.0

  character(255) :: filen
  real, dimension(length) :: stored_data
  integer, dimension(length) :: flag
  integer index

  filen = "vor.dat"

  print *, "Reading the file ", trim(filen)
  open(10, file=trim(filen),form="unformatted",
 &     access="direct", recl = length*4)
  read (10, rec=1) stored_data
  close(10)

  do index = 1, length
     if (stored_data(index).ge.threshold) then
        flag(index) = 1
     else
        flag(index) = 0
     end if
  end do

  stop
  end program

蟒蛇文件:

#!/usr/bin/env python

import struct
import numpy as np

f_type = 'float32'
length = 512**3
threshold = 1320.0
file = 'vor_00000_455.float'

f = open(file,'rb')
data = np.fromfile(f, dtype=f_type, count=-1)
f.close()

flag = []

for index in range(length):
    if (data[index] >= threshold):
        flag.append(1)
    else:
        flag.append(0)

** * ** * ***编辑** * ***

感谢您的意见。我不确定如何在 fortran 中执行此操作。我尝试了以下方法,但这仍然很慢。

 flag = np.ndarray(length, dtype=np.bool)    
 for index in range(length):
     if (data[index] >= threshold):
         flag[index] = 1
     else:
         flag[index] = 0

谁能给我看看?

4

3 回答 3

6

你的两个程序完全不同。您的 Python 代码反复更改结构的大小。您的 Fortran 代码没有。您不是在比较两种语言,而是在比较两种算法,其中一种显然是劣等的。

于 2013-06-26T08:18:54.557 回答
3

一般来说,Python 是一种解释型语言,而 Fortran 是一种编译型语言。因此,您在 Python 中有一些开销。但它不应该花那么长时间。

在 python 版本中可以改进的一件事是用索引操作替换 for 循环。

#create flag filled with zeros with same shape as data
flag=numpy.zeros(data.shape)
#get bool array stating where data>=threshold
barray=data>=threshold
#everywhere where barray==True put a 1 in flag
flag[barray]=1

较短的版本:

#create flag filled with zeros with same shape as data
flag=numpy.zeros(data.shape)
#combine the two operations without temporary barray
flag[data>=threshold]=1
于 2013-06-26T08:17:34.893 回答
1

试试这个python:

flag = data > threshhold

它会给你一个你想要的标志数组。

于 2013-06-26T08:15:57.027 回答