python dask DataFrame,支持(可并行化)行应用吗?

2024-04-11

我最近发现dask http://dask.pydata.org/en/latest/index.html旨在成为一个易于使用的 python 并行处理模块。对我来说最大的卖点是它可以与熊猫一起使用。

在阅读了其手册页后,我找不到一种方法来完成这个简单的可并行任务:

ts.apply(func) # for pandas series
df.apply(func, axis = 1) # for pandas DF row apply

目前,要在 dask 中实现这一点,据我所知,

ddf.assign(A=lambda df: df.apply(func, axis=1)).compute() # dask DataFrame

这是一种丑陋的语法,而且实际上比直接的要慢

df.apply(func, axis = 1) # for pandas DF row apply

有什么建议吗?

编辑:感谢@MRocklin 的地图功能。它似乎比普通的熊猫应用慢。这与 pandas GIL 释放问题有关还是我做错了?

import dask.dataframe as dd
s = pd.Series([10000]*120)
ds = dd.from_pandas(s, npartitions = 3)

def slow_func(k):
    A = np.random.normal(size = k) # k = 10000
    s = 0
    for a in A:
        if a > 0:
            s += 1
        else:
            s -= 1
    return s

s.apply(slow_func) # 0.43 sec
ds.map(slow_func).compute() # 2.04 sec

map_partitions

您可以使用以下命令将函数应用于数据框的所有分区map_partitions功能。

df.map_partitions(func, columns=...)

请注意, func 一次只会给出数据集的一部分,而不是像 with 那样给出整个数据集pandas apply(如果你想做并行性,你可能不希望这样做。)

map / apply

您可以将函数按行映射到系列中map

df.mycolumn.map(func)

您可以使用以下命令在数据框中按行映射函数apply

df.apply(func, axis=1)

线程与进程

从版本 0.6.0 开始dask.dataframes与线程并行。自定义 Python 函数不会从基于线程的并行性中获得太多好处。你可以尝试流程

df = dd.read_csv(...)

df.map_partitions(func, columns=...).compute(scheduler='processes')

但要避免apply

然而,你真的应该避免apply在 Pandas 和 Dask 中使用自定义 Python 函数。这通常是性能不佳的根源。如果您找到一种以矢量化方式执行操作的方法,那么您的 Pandas 代码可能会快 100 倍,并且您根本不需要 dask.dataframe。

考虑numba

对于您的特定问题,您可能会考虑numba http://numba.pydata.org/。这会显着提高您的表现。

In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: s = pd.Series([10000]*120)

In [4]: %paste
def slow_func(k):
    A = np.random.normal(size = k) # k = 10000
    s = 0
    for a in A:
        if a > 0:
            s += 1
        else:
            s -= 1
    return s
## -- End pasted text --

In [5]: %time _ = s.apply(slow_func)
CPU times: user 345 ms, sys: 3.28 ms, total: 348 ms
Wall time: 347 ms

In [6]: import numba
In [7]: fast_func = numba.jit(slow_func)

In [8]: %time _ = s.apply(fast_func)  # First time incurs compilation overhead
CPU times: user 179 ms, sys: 0 ns, total: 179 ms
Wall time: 175 ms

In [9]: %time _ = s.apply(fast_func)  # Subsequent times are all gain
CPU times: user 68.8 ms, sys: 27 µs, total: 68.8 ms
Wall time: 68.7 ms

免责声明,我在生产这两种产品的公司工作numba and dask并雇用了许多pandas开发商。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python dask DataFrame,支持(可并行化)行应用吗? 的相关文章

  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • tkinter 上的“NoneType”对象没有属性“get”错误[重复]

    这个问题在这里已经有答案了 我最近开始使用 python 3 6 进行编码tkinter并尝试创建我自己的项目repl it 该项目是一个简单的交互式待办事项列表 但是我陷入困境并且无法使该功能正常工作 该函数只是简单地获取条目并将其添加到
  • PRAW 出现 SSLError?

    我正在尝试开始使用 PRAW 但在使用 login 时遇到问题 我有以下代码 import praw r praw Reddit This is a test bot r login myRedditUsername password 我收
  • 将Python嵌入到C中——导入模块

    我在使用嵌入式 Python for C 时遇到问题文档 http docs python org extending embedding html 每当我尝试使用导入的模块时 我都会得到 PythonIncl exe 中 0x1e089e
  • Python textwrap.wrap 导致 \n 问题

    所以我只是重新格式化了一堆代码以合并textwrap wrap 却发现我所有的 n都消失了 这是一个例子 from textwrap import wrap def wrapAndPrint msg width 25 wrap msg to
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • Odoo:如何覆盖原始功能

    在 Odoo 中 每次打开产品表单时都会计算产品的数量 这发生在模型中product product gt function product available 该函数返回一个名为 res 的字典 Example res 8 qty ava
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • Python 多处理:全局对象未正确复制到子级

    前几天我回答了一个关于SO的问题 https stackoverflow com q 67047533 1925388关于并行读取 tar 文件 这是问题的要点 import bz2 import tarfile from multipro
  • 在 CSV 文件的最上面一行写入

    我有这个sample csv 文件 a 1 apple b 2 banana c 3 cranberry d 4 durian e 5 eggplant 并有以下代码 samplefile open sample csv rb rows s
  • Python 柯里化任意数量的变量

    我正在尝试使用柯里化在 Python 中进行简单的函数添加 我找到了这个咖喱装饰器here https gist github com JulienPalard 021f1c7332507d6a494b def curry func def
  • 为什么变量不在循环外更新?

    无法弄清楚为什么结果中的第一个键是 abc 而不是我期望的 c 我使用的是Python 3 6 4 数据结构很奇怪 因为我删除了不相关的键和值 f replace ab r data abc 1 def 2 ghi 3 jkf 4 lmn
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • “gi.repository.Gtk”对象没有属性“gdk”

    我正在尝试使用 GTK 创建多线程 需要 Gtk gdk 但我收到有关没有 gdk 属性的错误 我正在使用带有 Raspbian 的 Raspberry Pi 这就是我导入 GTK 库的方式 try import pygtk pygtk r
  • 无法从源 pylance 解析导入烧瓶

    我正在学习 Python 课程的一部分是使用 Flask 设置网络服务器 我按照 Flask 安装文档执行了步骤 由于某种原因 flask 模块带有下划线 如下所示 当我将鼠标悬停时 我会得到如下附加信息 无法从源 pylance 解析导入
  • 按键合并的两个字典的值的并集

    我有两本词典 d1 a x y b k l d2 a m n c p r 如何合并这两个字典以获得这样的结果 d3 a x y m n b k l c p r 当字典的值是简单类型 如 int 或 str 时 这有效 d3 dict i a
  • 打包布尔数组需要通过 int (numpy 1.8.2)

    我正在寻找更紧凑的方式来存储布尔值 numpy 内部需要 8 位来存储一个布尔值 但是np packbits允许打包 他们 这真是太酷了 问题是要打包在4e6字节数组a32e6字节我们需要首先使用的布尔值数组256e6字节将布尔数组转换为
  • centos上无法安装Pillow

    我上面有 centos 6 3 和 python 2 6 当我尝试通过 easy install 安装它时 出现以下错误 imaging c 76 20 error Python h No such file or directory In

随机推荐

  • 针对 SSE2 之前的处理器的 Java 运行时如何实现浮点基本运算?

    针对没有 SSE2 的 Intel 处理器的 Java 运行时如何处理浮点非规格化 当strictfp is set 即使 387 FPU 设置为 53 位精度 它也会保持超大的指数范围 强制检测每个中间结果的下溢 溢出 以及 使得很难避免
  • Python JSON AttributeError:“str”对象没有属性“read”

    我是 Python 初学者 Python 3 7 6 import json fil numbers json num with open fil r as file for obj in file num append json load
  • 如何用一个命令停止 mongo DB

    我需要能够在 cli 上启动 停止 MongoDB 开始非常简单 mongod 但要停止 mongo DB 我需要先运行 open mongo shell 然后键入两个命令 蒙戈 使用管理员 db shutdownServer 所以我不知道
  • shark不显示源代码

    我们正在尝试在 iPhone 应用程序上运行 shark 然而 在分析的样本中 它没有列出我们的任何应用程序功能 所有列出的都是库 当我们单击其中任何一个时 汇编代码都是可见的 大多数网站在构建应用程序时都会提到 生成调试符号 选项 我也找
  • 包括使用 Lambda 表达式

    在基于字符串的重载中Include我们指定包含一个集合 然后简单地通过以正确的顺序指定相关导航属性来包含下一层的引用 query Include Level1Collection Level2Reference 但是为什么当使用重载时Inc
  • Android 的自定义类加载器?

    我正在编写一个仪器库 我想在桌面和移动设备 Android 上使用它 它的功能是 公开一个带有单个参数的 main 即目标类的 main 安装一个类加载器 在加载所有类时拦截它们并对其进行检测 Like so Expects args 0
  • Electron打包后不支持ES6

    我正在使用各种ES6语法 http es6 features org 例如importETC React https reactjs org code JSX https reactjs org docs introducing jsx h
  • NEHotspotConfigurationManager 收到此警报:“无法加入网络<网络名称>”,而错误为零

    所以我试图通过关闭器监视连接状态 func reconnect success escaping gt Void failure escaping gt Void let manager NEHotspotConfigurationMana
  • 有没有办法摆脱 git status 中的帮助消息?

    Changes not staged for commit use git add
  • 如何从 Instagram API 获取访问令牌

    我一直在关注 Instagram 的基本指南https developers facebook com docs instagram basic display api guides getting access tokens and pe
  • 删除 t-sql 中所有大表的最佳方法是什么?

    我们遇到了一个有点奇怪的情况 基本上 我们的一个数据库中有两个表 其中包含大量我们不需要或不关心的日志信息 部分原因是我们的磁盘空间不足 我正在尝试清理表 但这需要很长时间 在周末运行后仍然有 57 000 000 多条记录 而这只是第一个
  • PageView 内的 InteractiveViewer

    我正在创建一个包含图像列表的 PageView 并且我想向每个图像添加 InteractiveViewer 以便可以调整其大小以查看详细信息 这是我写的 PageView builder dragStartBehavior DragStar
  • 将 numpy 数组转换为十六进制字节数组

    我想在 python 2 7 中将 numpy 数组转换为字节串 比如说我的 numpy 数组a是一个简单的2x2数组 看起来像这样 1 10 16 255 我的问题是 如何将此数组转换为字节字符串或字节数组 输出如下 x01 x0A x1
  • 如何使用webpack导入静态url

    如何使用 webpack 导入静态 url index js import http google com myscript js 确实不清楚你想做什么 但总的来说你有几个选择 预先下载脚本或通过 NPM 安装 这可能是处理外部依赖关系的首
  • Ruby on Rails robots.txt 文件夹

    我即将启动 Ruby on Rails 应用程序 作为最后一个任务 我想设置机器人 txt文件 我找不到有关如何为 Rails 应用程序正确编写路径的信息 起始路径是否始终是 Ruby on Rails 应用程序或应用程序文件夹的根路径 那
  • 启用 iCloud 时 iOS 应用程序在首次启动时冻结

    我在 iOS 应用程序中启用了 iCloud 并且在首次启动应用程序时 当我按下应用程序中的任何视图时 应用程序会冻结大约 5 秒 我跟着this http timroadley com 2012 04 03 core data in ic
  • GitHub - 当非默认分支与主分支合并时,PR 链接的问题不会被关闭

    I have main作为默认分支和dev作为非默认 我创建了一个问题和一个 PR 以从新的合并temp分支到dev分支 在公关中 我曾提到过Resolves 1 当我将 PR 合并到dev分支 问题 1不会关闭 因为它是非默认分支 然后我
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 如何在本地执行 Capistrano 任务?

    我定义了一个自定义 Capistrano 任务 该任务应该在本地运行 在我的开发计算机上 desc Push code to Dreamhost task push do run git push dreamhost end 但是当我尝试跑
  • python dask DataFrame,支持(可并行化)行应用吗?

    我最近发现dask http dask pydata org en latest index html旨在成为一个易于使用的 python 并行处理模块 对我来说最大的卖点是它可以与熊猫一起使用 在阅读了其手册页后 我找不到一种方法来完成这