WEEK 5: Implementing Lazy Loading in FURY with lazy_loader#

Hello everyone,#

Welcome back to my Google Summer of Code (GSoC) 2024 journey! This week has been particularly exciting as I introduced a significant performance optimization feature: lazy loading. Here’s an overview of my progress and contributions.

Introduction of lazy loading#

This week, I focused on implementing the lazy_loader feature of Scientific Python to optimize module loading in FURY. Lazy loading improves performance by deferring the loading of modules until they are actually needed, thus reducing start-up times and memory footprint.

The implementation involved:

  1. Implementation of Lazy Loading:

    • Application of lazy loading in several FURY modules using the lazy_loader module to improve performance

  2. Update __init__.py files:

    • Modified __init__.py files to support lazy loading where necessary. This ensures that modules are only loaded when they are accessed for the first time

  3. Added Type Stubs (__init__.pyi):

    • Adding type stubs (__init__.pyi) provides type hints for lazy-loading modules, improving code readability and maintainability

  4. Improved module organization:

    • Improved module organization in __init__.py and __init__.pyi files, to effectively support lazy loading.

Example Implementation#

To give you an idea, here’s the actual implementation of how lazy loading was done using the lazy_loader module in FURY:

__init__.py File:

import lazy_loader as lazy
from fury.pkg_info import __version__, pkg_commit_hash

__getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)

_all__ += [
"__version__",
"disable_warnings",
"enable_warnings",
"get_info",
]

# ... (functions)

__init__.pyi File:

# This file is a stub type for the fury package. It provides information about types
# to help type-checking tools like mypy and improve the development experience
# with better autocompletion and documentation in code editors.

__all__ = [
    "actor",
    "actors",
    "animation",
    "colormap",
    # ... (other modules)
    ,
    ]

    from . import (
        actor,
        actors,
        animation,
        colormap,
        # ... (other modules)
        ,
        )
        # ... (other functions)

You can review the implementation in this pull request.

Reading SPEC1#

To align myself with best practice, I read the SPEC1 document available at Scientific Python SPEC1. This document provided valuable hints and guidelines that I took into account when implementing the lazy loading feature.

Did I get stuck anywhere?#

No, I didn’t encounter any major blockers this week. The implementation of lazy loading went smoothly, and I was able to complete the task.

What’s Next?#

For the next week, I plan to:

  1. Review all my Pull Requests with my mentor Serge Koudoro, to ensure everything is up to FURY’s standards.

  2. Start working on the redesign of the FURY website, making it more user-friendly and visually appealing.

Thank you for reading. Stay tuned for more updates on my progress!