最近,我遇到了这个名为swifter的有用库,以加快 python 中熊猫系列的处理速度。我确信它在引擎盖下进行了大量的矢量化处理和优化,但是我很好奇它如何通过导入来设法将新属性引入到熊猫系列或数据框架对象中。
#!/usr/bin/env python3
# encoding: utf-8
import pandas as pd # Version 1.4.1
import numpy as np # Version 1.22.3
samples:int=2**20
colname:str='Value'
frame=pd.DataFrame(data={colname:np.random.randint(low=0, high=45353, size=samples)})
import swifter # Version 1.22.3 The following line throws an attribute error without this import
frame[colname].swifter # With swifter imported, this is swifter.SeriesAccessor object
这看起来真的很神奇,因为我认为一个 import 语句可以引入新的类,函数等,但不能改变已经存在于命名空间中的对象的 API (可用的方法)。这只是在某种程度上与我的思维模型冲突的对象如何工作和在 OOP 范式中交互。
导入模块或包时,Python 会加载并执行其中的代码。
当您import swifter
时,Python 会加载swifter.__init__
文件,其中包含:
if "modin.pandas" in sys.modules:
register_modin()
当条件为真时,执行register_modin
。通常,当您import一个模块或一个包时,除了在本地范围内注册一些变量,函数或类之外,代码没有副作用。
为了避免魔法,好的做法是这样的:
from swifter import register_modin
register_modin()
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(58条)