最近,我发现了一个名为更快的有用库,以加速处理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这看起来真的很神奇,因为我认为导入语句可以引入新的类、函数等,但不能改变已经存在于命名空间中的对象的API (方法可用)。这在某种程度上与我关于对象如何在OOP范式中工作和交互的心智模型发生了冲突。对于它是如何完成的,或者它是否使用了python语言的一些更深层次的高级特性,任何指导都是很棒的。
发布于 2022-07-29 04:33:29
当您导入模块或包时,Python会加载并在其中执行代码。
当您使用import swifter时,Python加载包含以下内容的swifter.__init__文件:
if "modin.pandas" in sys.modules:
register_modin()由于条件为真,因此将执行register_modin。通常,当您在导入模块或包时,除了在本地作用域中注册一些变量、函数或类外,代码没有副作用。
为了避免魔法,好的做法应该是:
from swifter import register_modin
register_modin()看看存取者
https://stackoverflow.com/questions/73161362
复制相似问题