Skip to content

Commit 9d63421

Browse files
feat: speed up requires_package using caching (#3705)
* test: refactor check_stds and post_mortem_checks * test: backing off algorithm * chore: adding changelog file 3703.added.md [dependabot-skip] * fix: codacity warnings * feat: using get_value to obtain the n elements * revert: revert "feat: using get_value to obtain the n elements" Performance is not as go This reverts commit 877f803. * feat: using get_value to obtain the n elements * revert: revert "feat: using get_value to obtain the n elements" Performance is not as go This reverts commit 877f803. * feat: using mapdl.exit when raising final error. * test: fix test by avoiding killing mapdl. * fix: test * fix: test * feat: adding warnings when restarting MAPDL during testing * fix: test * feat: caching requires_package * test: adding more tests * chore: adding changelog file 3705.added.md [dependabot-skip] * chore: adding changelog file 3705.added.md [dependabot-skip] * fix: warnings import --------- Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent 6060cab commit 9d63421

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

doc/changelog.d/3705.added.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
feat: speed up `requires_package` using caching

src/ansys/mapdl/core/misc.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
"""Module for miscellaneous functions and methods"""
2424
from enum import Enum
25-
from functools import wraps
25+
from functools import cache, wraps
2626
import importlib
2727
import inspect
2828
import os
@@ -415,6 +415,16 @@ def write_array(filename: Union[str, bytes], array: np.ndarray) -> None:
415415
np.savetxt(filename, array, fmt="%20.12f")
416416

417417

418+
@cache
419+
def is_package_installed_cached(package_name):
420+
try:
421+
importlib.import_module(package_name)
422+
return True
423+
424+
except ModuleNotFoundError:
425+
return False
426+
427+
418428
def requires_package(package_name: str, softerror: bool = False) -> Callable:
419429
"""
420430
Decorator check whether a package is installed or not.
@@ -430,11 +440,11 @@ def requires_package(package_name: str, softerror: bool = False) -> Callable:
430440
def decorator(function):
431441
@wraps(function)
432442
def wrapper(self, *args, **kwargs):
433-
try:
434-
importlib.import_module(package_name)
443+
444+
if is_package_installed_cached(package_name):
435445
return function(self, *args, **kwargs)
436446

437-
except ModuleNotFoundError:
447+
else:
438448
msg = (
439449
f"To use the method '{function.__name__}', "
440450
f"the package '{package_name}' is required.\n"

tests/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import subprocess
2727
import time
2828
from typing import Dict, List
29+
from warnings import warn
2930

3031
import psutil
3132

tests/test_mapdl.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,3 +2836,14 @@ def test_none_on_selecting(mapdl, cleared, func):
28362836

28372837
assert len(selfunc("all")) > 0
28382838
assert len(selfunc(None)) == 0
2839+
2840+
2841+
def test_requires_package_speed():
2842+
from ansys.mapdl.core.misc import requires_package
2843+
2844+
@requires_package("pyvista")
2845+
def my_func(i):
2846+
return i + 1
2847+
2848+
for i in range(1_000_000):
2849+
my_func(i)

0 commit comments

Comments
 (0)