Skip to content

Commit e714e2b

Browse files
kavanaseshyuep
andauthored
Speed up Vasprun parsing some more (#4360)
* Make `_vasprun_float` faster for overflow cases * Make `_parse_vasp_array` significantly faster (>2x) using `numpy` * Simplify `_parse_vasp_array` * Ensure same output 2D format from `_parse_vasp_array` regardless of input shape --------- Co-authored-by: Shyue Ping Ong <[email protected]>
1 parent 60cb616 commit e714e2b

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/pymatgen/io/vasp/outputs.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,15 @@ def _parse_v_parameters(
133133
return floats
134134

135135

136-
def _parse_vasp_array(elem) -> list[list[float]]:
136+
def _parse_vasp_array(elem) -> list[list[float]] | NDArray[float]:
137137
if elem.get("type") == "logical":
138138
return [[i == "T" for i in v.text.split()] for v in elem]
139-
return [[_vasprun_float(i) for i in v.text.split()] for v in elem]
139+
140+
try:
141+
# numerical data, try parse with numpy loadtxt for efficiency:
142+
return np.loadtxt([e.text for e in elem], ndmin=2)
143+
except ValueError: # unexpectedly couldn't re-shape to grid
144+
return [list(map(_vasprun_float, e.text.split())) for e in elem]
140145

141146

142147
def _parse_from_incar(filename: PathLike, key: str) -> Any:
@@ -159,9 +164,7 @@ def _vasprun_float(flt: float | str) -> float:
159164
return float(flt)
160165

161166
except ValueError:
162-
flt = cast("str", flt)
163-
_flt: str = flt.strip()
164-
if _flt == "*" * len(_flt):
167+
if "*" in str(flt):
165168
warnings.warn(
166169
"Float overflow (*******) encountered in vasprun",
167170
stacklevel=2,
@@ -1522,7 +1525,7 @@ def _parse_kpoints(
15221525
if name == "kpointlist":
15231526
actual_kpoints = cast("list[Tuple3Floats]", list(map(tuple, _parse_vasp_array(va))))
15241527
elif name == "weights":
1525-
weights = [i[0] for i in _parse_vasp_array(va)]
1528+
weights = list(_parse_vasp_array(va))
15261529
elem.clear()
15271530

15281531
if kpoint.style == Kpoints.supported_modes.Reciprocal:

0 commit comments

Comments
 (0)