首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更快的库如何向对象引入新的属性?

更快的库如何向对象引入新的属性?
EN

Stack Overflow用户
提问于 2022-07-29 03:35:43
回答 1查看 71关注 0票数 0

最近,我发现了一个名为更快的有用库,以加速处理python中的熊猫系列。我确信它在引擎盖下进行了大量的矢量化处理和优化,但我很好奇它是如何通过导入来为熊猫系列或数据框架对象引入一个新属性的。用这个最小的代码。

代码语言:javascript
复制
#!/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语言的一些更深层次的高级特性,任何指导都是很棒的。

EN

回答 1

Stack Overflow用户

发布于 2022-07-29 04:33:29

当您导入模块或包时,Python会加载并在其中执行代码。

当您使用import swifter时,Python加载包含以下内容的swifter.__init__文件:

代码语言:javascript
复制
if "modin.pandas" in sys.modules:
    register_modin()

由于条件为真,因此将执行register_modin。通常,当您在导入模块或包时,除了在本地作用域中注册一些变量、函数或类外,代码没有副作用。

为了避免魔法,好的做法应该是:

代码语言:javascript
复制
from swifter import register_modin
register_modin()

看看存取者

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73161362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档