feat: add lazy loading for optional pandas and polars modules

Introduce two new functions, _optional_pandas_module and _optional_polars_module, to lazily import and cache the pandas and polars libraries. This change reduces overhead in hot paths by avoiding unnecessary imports when these libraries are not available. Update existing wrappers to utilize these functions for improved performance and cleaner error handling.
This commit is contained in:
Pratik Bhadane
2026-03-24 00:55:56 +05:30
parent 682bf063ca
commit ba8019ad27
2 changed files with 81 additions and 6 deletions
+24 -6
View File
@@ -20,6 +20,26 @@ DEFAULT_OHLCV_COLUMNS = {
}
@functools.lru_cache(maxsize=1)
def _optional_pandas_module():
"""Import pandas lazily once and cache absence for low-overhead hot paths."""
try:
import pandas as pd
except ImportError:
return None
return pd
@functools.lru_cache(maxsize=1)
def _optional_polars_module():
"""Import polars lazily once and cache absence for low-overhead hot paths."""
try:
import polars as pl
except ImportError:
return None
return pl
def _to_f64(data: ArrayLike) -> np.ndarray:
"""Convert any array-like to a contiguous 1-D float64 NumPy array.
@@ -159,9 +179,8 @@ def pandas_wrap(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
import pandas as pd # local import — pandas is optional
except ImportError:
pd = _optional_pandas_module()
if pd is None:
return func(*args, **kwargs)
pd_index = None
@@ -232,9 +251,8 @@ def polars_wrap(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
import polars as pl # local import — polars is optional
except ImportError:
pl = _optional_polars_module()
if pl is None:
return func(*args, **kwargs)
pl_name: Optional[str] = None