0

512**3 データ ポイントの単精度データを含むファイルを読み込んでいます。しきい値に基づいて、各ポイントに 1 または 0 のフラグを割り当てます。同じことを行う 2 つのプログラムを作成しました。1 つは Fortran で、もう 1 つは 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

Python ファイル:

#!/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