程序员的懒,是一种美德?

大家好,我是小K。

最近在用Polars模块改写Pandas的代码…

领导说:Polars的懒加载机制非常牛掰,值得一改…

我怼之:“懒还有牛掰的?,那我不就是..?”

图片

领导答:说起“懒加载”(Lazy Loading),很多刚学编程的小伙伴(指我)第一反应是:

这不就是偷懒嘛?等要用的时候再加载,听起来挺不负责任的啊。

但实际上,这是一种顶级程序员的懒——那种“有智慧、有远见”的懒。

真·懒人都是善于用最少的动作,达成最高效的结果。

懒加载是个啥?

懒加载,说白了就是:

能不现在做的事,就先不做。

只有等到“非做不可”的时候,才去做。

比如你打开一个 App,它首页可能要显示几十张图片。

如果每张都在启动时加载,那 App 得卡成 PPT。

所以聪明的工程师会设计成: 你往下滑,看到哪张图,才去加载哪张图。(Ajax?)图片

这就是懒加载。

在网页、游戏、甚至 Python 程序里,这个套路都一样。 先不干活,等真有用时再上。

Python里的懒,是怎么实现的?

举个例子,假设你有个类要加载一大堆数据,比如一百万条用户记录。

你当然可以在 __init__ 里一次性全读进来。

但那样启动时程序会慢得像在石头上跑。

聪明的写法是这样:

class Data:
    def __init__(self):
        self._data = None  # 先不加载
    @property
    def data(self):
        if self._data is None:
            print("正在努力加载数据...")
            self._data = [i for i in range(10**6)]
        return self._data

这个写法的精髓就是:

你第一次访问 data 时,它才真的去加载。

第二次再用,就不用重复加载了。

既懒又聪明!

程序运行的时候:

>>> d = Data()
>>> print("对象创建完了")
对象创建完了
>>> d.data
正在努力加载数据...

完美演示了“该干的时候再干”的精神。

懒加载还有其他玩法

模块导入也能懒:

def heavy_task():
    import numpy as np  # 只有这时候才导入
    return np.mean(np.random.rand(1000, 1000))

想象一下,你写个工具脚本,只偶尔用到 numpy。

没必要一启动就加载那么大个库,拖慢启动速度。

等真要用到它的时候再加载,香得很。

懒加载的化身–生成器

直接上代码:

def count_up_to(n):
    for i in range(1, n + 1):
        yield i

这个函数不一次性生成所有数字,而是你要一个,它给一个。

要五个,它慢悠悠地生成五次。

既省内存,又很优雅。

这就好比自助餐厅:

不需要一开始全上桌,而是你吃啥它再给啥。

程序运行轻松多了。

最后

有人说:“那我为什么不干脆直接全加载?反正内存够。”

问题在于——懒加载不是怕累,是怕浪费

数据太,一次加载容易崩;

模块太,启动太慢用户会骂;

某些计算很,但结果只用一次;

网络请求太,还没用就全发了,纯属浪费带宽。

原文链接:https://www.zsiss.com/9349.html,转载请注明出处。
0

评论0

请先
外贸商城 M010(服装服饰)
外贸商城 M010(服装服饰)
3分钟前 有人购买 去瞅瞅看

社交账号快速登录