- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是read this introduction ,但在实现这两个示例时遇到问题(注释代码是第二个示例):
import asyncio
import pandas as pd
from openpyxl import load_workbook
async def loop_dfs(dfs):
async def clean_df(df):
df.drop(["column_1"], axis=1, inplace=True)
... a bunch of other inplace=True functions ...
return "Done"
# tasks = [clean_df(df) for (table, dfs) in dfs.items()]
# await asyncio.gather(*tasks)
tasks = [clean_df(df) for (table, df) in dfs.items()]
completed, pending = await asyncio.wait(tasks)
def main():
dfs = {
sn: pd.read_excel("excel.xlsx", sheet_name=sn)
for sn in load_workbook("excel.xlsx").sheetnames
}
# loop = asyncio.get_event_loop()
# loop.run_until_complete(loop_dfs(dfs))
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(loop_dfs(dfs))
finally:
loop.close()
main()
我看到了一些关于 pandas 如何不支持 asyncio 的其他帖子,也许我只是错过了更大的图片,但如果我正在执行就地操作,那应该不重要,对吗? I saw recommendations for Dask但没有立即支持读取 Excel,我想我会先尝试这个,但我不断得到
RuntimeError: Event loop already running
最佳答案
I saw a few other posts about how pandas doesn't support asyncio, and maybe i'm just missing a bigger picture, but that shouldn't matter if i'm doing inplace operations right?
就地操作是那些 modify existing data 。这是一个效率问题,而您的目标似乎是并行化,这是一个完全不同的问题。
Pandas 不支持 asyncio,不仅因为它尚未实现,而且因为 Pandas 通常不执行 asyncio 支持良好的操作类型:网络和子进程 IO。 Pandas 函数要么使用 CPU,要么等待磁盘访问,这两者都不适合 asyncio。 Asyncio 允许使用看起来像普通同步代码的协程来表达网络通信。在协程内部,每个阻塞操作(例如网络读取)都会被等待,如果数据尚不可用,它会自动挂起整个任务。每次这样的暂停,系统都会切换到下一个任务,从而有效地创建一个协作多任务系统。
当尝试调用不支持 asyncio 的库(例如 pandas)时,表面上看起来一切正常,但您不会获得任何好处,并且代码将串行运行。例如:
async def loop_dfs(dfs):
async def clean_df(df):
...
tasks = [clean_df(df) for (table, df) in dfs.items()]
completed, pending = await asyncio.wait(tasks)
由于 clean_df
不包含 await
的单个实例,因此它只是名义上的协程 - 它永远不会真正暂停其执行以允许其他协程运行。因此 await asyncio.wait(tasks)
将连续运行任务,就像您编写的那样:
for table, df in dfs.items():
clean_df(df)
为了让事情并行运行(假设 pandas 在其操作期间偶尔释放 GIL),您应该将各个 CPU 绑定(bind)函数移交给线程池:
async def loop_dfs(dfs):
def clean_df(df): # note: ordinary def
...
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(clean_df, df)
for (table, df) in dfs.items()]
completed, pending = await asyncio.wait(tasks)
如果您沿着这条路线走下去,那么您一开始就不需要 asyncio,只需使用 concurrent.futures
即可。例如:
def loop_dfs(dfs): # note: ordinary def
def clean_df(df):
...
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = [executor.submit(clean_df, df)
for (table, df) in dfs.items()]
concurrent.futures.wait(futures)
figured i'd try this first but I keep getting
RuntimeError: Event loop already running
该错误通常意味着您已在已为您运行 asyncio 的环境(例如 jupyter 笔记本)中启动了脚本。如果是这种情况,请确保使用普通的 python
运行脚本,或者查阅笔记本的文档,了解如何更改代码以将协程提交到已运行的事件循环。
关于python - Asyncio Pandas 与 Inplace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340476/
我正在尝试填充行子集中的缺失值。我在 fillna() 中使用了 inplace=True,但它在 jupyter notebook 中不起作用。您可以在 Surface 列的前两行看到显示 NaN
我目前正在开发一个更新数据框的函数。 有两种方法可以做到这一点。 示例 1:就地编辑。 创建数据框 mydf = pd.DataFrame({'name':['jim','john','mary','
我有一行代码看起来像这样: te_succ_rate = np.mean(np.argmax(test_y, axis=1) == self.predictor(test_x)) 其中 test_y
我正在以下列形式简化 python 中的一些 null/false 检查: 这个: if not a: a = 'foo' 可以简化为: a = a or 'foo' 并且,往上看很自然地会尝
pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改 inplace = True:不创建新的对象,直接对原始对象进行修改; inplace = F
我正在使用 Primefaces p:inplace,这样当单击某些文本时,它会替换为 h:selectOneMenu,用户可以从那里打开菜单并从下拉选项中选择一个选项。如果当我单击 p:inplac
例如 main = do let ls = [0..10000000] print ls 这将使用 O(1) 内存创建数组“就地”。 以下编辑导致程序在执行时内存不足。 main = do
我建立了一个maven多模块项目,其中一个带有包装“war”,另外两个带有包装“jar”。 当我在父项目上执行“mvn war:inplace”时,Maven 会为每个子项目生成一个文件夹 src/m
我只是read this introduction ,但在实现这两个示例时遇到问题(注释代码是第二个示例): import asyncio import pandas as pd from openp
同时使用 在 PrimeFaces (5.0) 中,保存和取消按钮的显示位置看起来很合适,当 与 一起使用但是那些按钮看起来很难看,当 与其他组件一起使用。 下面给出了一些例子。
我有一个带有多索引的数据框 values observations time x1 x2 x3 x4
我正在使用以下命令构建一个 Cython 程序(称为 ex.testpackage): python setup.py build_ext --inplace 在像 /home/USER/Docume
根据 PyTorch 论坛上的讨论: What’s the difference between nn.ReLU() and nn.ReLU(inplace=True)? Guidelines for
我正在尝试获得一个可以切换 p:inplace 项目的按钮。我正在尝试使用切换功能,但没有任何运气。 当我这样做时,我在浏览器的控制台中收到以下消息 未捕获的类型错误:无法调用未定义的
这个问题已经有答案了: Why does my Pandas DataFrame not display new order using `sort_values`? (2 个回答) 已关闭 4 年前
在我的数据框列中,我将 6.3.5、1.8、5.10.0 等版本号保存为对象,因此可能保存为字符串。我想删除所有点,所以我得到 635、18、5100。我的代码想法是这样的: for row in d
如果目标数据类型和源数据类型不同,就地 Mat::convertTo 会导致缓冲区溢出。 请问大家也有这个问题吗?我可以修复吗? 最佳答案 您使用的是什么版本的 OpenCV?这似乎是很久以前在修订版
在 Swift 2.3 中,我们可以这样写: var rect = CGRect(...) rect.offsetInPlace(dx: 15, dy: 0) 将一个矩形向右移动 15pt。 但是在
我已经编写了一些 vector 方法,这些方法可以就地或复制进行简单的数学运算,并且对就地变体具有相同的惩罚。 最简单的可以归结为如下内容: void scale(float* dst, const
我正在尝试使用 --inplace 全局选项更新一个 xml 标签,如下所示 xml ed --inplace -N x="http://java.sun.com/xml/ns/j2ee" -u
我是一名优秀的程序员,十分优秀!