11import glob
22import os
3+ import time
34from typing import Optional
45
56import numpy as np
@@ -24,17 +25,21 @@ def __init__(
2425 super ().__init__ (predict_metadata , extra_variables )
2526 self .workdir = workdir
2627
27- def _add_forecast (self , times , ensemble_member , pred ):
28+ def _add_forecast (self , times , ensemble_member , pred ) -> None :
29+ t0 = time .perf_counter ()
2830 filename = self .get_filename (times [0 ], ensemble_member )
2931 utils .create_directory (filename )
3032
3133 np .save (filename , pred )
34+ utils .LOGGER .debug (
35+ f"Intermediate._add_forecast for { filename } in { time .perf_counter () - t0 :.1f} s"
36+ )
3237
33- def get_filename (self , forecast_reference_time , ensemble_member ):
38+ def get_filename (self , forecast_reference_time , ensemble_member ) -> str :
3439 frt_ut = utils .datetime_to_unixtime (forecast_reference_time )
3540 return f"{ self .workdir } /{ frt_ut :.0f} _{ ensemble_member :.0f} .npy"
3641
37- def get_forecast_reference_times (self ):
42+ def get_forecast_reference_times (self ) -> list [ np . datetime64 ] :
3843 """Returns all forecast reference times that have been saved"""
3944 filenames = self .get_filenames ()
4045 frts = []
@@ -48,7 +53,9 @@ def get_forecast_reference_times(self):
4853
4954 return frts
5055
51- def get_forecast (self , forecast_reference_time , ensemble_member = None ):
56+ def get_forecast (
57+ self , forecast_reference_time , ensemble_member = None
58+ ) -> np .ndarray | None :
5259 """Fetches forecasts from stored numpy files
5360
5461 Args:
@@ -61,6 +68,7 @@ def get_forecast(self, forecast_reference_time, ensemble_member=None):
6168 4D otherwise (leadtime, points, variables, members)
6269 """
6370
71+ t0 = time .perf_counter ()
6472 if ensemble_member is None :
6573 shape = [
6674 self .pm .num_leadtimes ,
@@ -73,16 +81,21 @@ def get_forecast(self, forecast_reference_time, ensemble_member=None):
7381 filename = self .get_filename (forecast_reference_time , e )
7482 if os .path .exists (filename ):
7583 pred [..., e ] = np .load (filename )
84+ utils .LOGGER .debug (
85+ f"Intermediate.get_forecast for { filename } in { time .perf_counter () - t0 :.1f} s"
86+ )
7687 else :
7788 assert isinstance (ensemble_member , int )
7889
7990 filename = self .get_filename (forecast_reference_time , ensemble_member )
8091 pred = np .load (filename ) if os .path .exists (filename ) else None
81-
92+ utils .LOGGER .debug (
93+ f"Intermediate.get_forecast for { filename } in { time .perf_counter () - t0 :.1f} s"
94+ )
8295 return pred
8396
8497 @property
85- def num_members (self ):
98+ def num_members (self ) -> int :
8699 filenames = self .get_filenames ()
87100
88101 max_member = 0
@@ -91,22 +104,23 @@ def num_members(self):
91104 max_member = max (int (member ), max_member )
92105 return max_member + 1
93106
94- def get_filenames (self ):
107+ def get_filenames (self ) -> list [ str ] :
95108 return glob .glob (f"{ self .workdir } /*_*.npy" )
96109
97- def cleanup (self ):
110+ def cleanup (self ) -> None :
98111 """Removes up all intermediate files and removes the workdir. Called in finalize of the main output."""
99-
112+ t0 = time . perf_counter ()
100113 for _filename in self .get_filenames ():
101114 try :
102115 os .remove (_filename )
103116 except OSError as e :
104- print (f"Error during cleanup of { _filename } : { e } " )
117+ utils . LOGGER . warning (f"Error during cleanup of { _filename } : { e } " )
105118
106119 try :
107120 os .rmdir (self .workdir )
108121 except OSError as e :
109- print (f"Error removing workdir { self .workdir } : { e } " )
122+ utils .LOGGER .warning (f"Error removing workdir { self .workdir } : { e } " )
123+ utils .LOGGER .debug (f"Intermediate.cleanup in { time .perf_counter () - t0 :.1f} s" )
110124
111125 def finalize (self ):
112126 pass
0 commit comments