首页  >  文章  >  后端开发  >  FireDucks:以零学习成本获得超越 pandas 的性能!

FireDucks:以零学习成本获得超越 pandas 的性能!

Susan Sarandon
Susan Sarandon原创
2024-10-03 06:23:021090浏览

Pandas 是最受欢迎的库之一,当我在寻找一种更简单的方法来加速其性能时,我发现了 FireDucks 并对它产生了兴趣!

与 pandas 的比较:为什么选择 FireDucks?

Pandas 程序可能会遇到严重的性能问题,具体取决于其编写方式。然而,作为一名数据科学家,我想花越来越多的时间分析数据,而不是提高代码性能。因此,如果它能够执行诸如交换进程顺序并自动加速程序性能之类的事情,那就太好了。例如,Process A => Process B 会比较慢,所以我们将其替换为 Process B => Process A。(当然,结果保证是一样的。)据说数据科学家花费了大约他们 45% 的时间都在准备数据,当我考虑做一些事情来加速这个过程时,我遇到了一个名为 FireDucks 的模块。

从 FireDucks 文档来看,它似乎仅支持 Linux 平台。由于我在我的主机上使用 Windows,所以我想从 WSL2(Windows Subsystem for Linux)尝试一下,这是一个可以在 Windows 上运行 Linux 的环境。

我尝试的环境如下

  • 操作系统 Microsoft Windows 11 Pro
  • 版本 10.0.22631 内部版本 22631
  • 系统型号 Z690 Pro RS
  • 系统类型基于 x64
  • PC 处理器第 12 代 Intel(R) Core(TM) i3–12100、3300 Mhz、4 核、8 个逻辑处理器
  • 底板产品 Z690 Pro RS
  • 平台角色桌面
  • 安装的物理内存 (RAM)64.0 GB

安装和配置 FireDucks

安装 WSL

WSL 是在以下 Microsoft 文档的帮助下安装的; Linux 发行版是 Ubuntu 22.04.1 LTS。

安装 FireDucks

然后实际安装FireDucks。不过安装起来非常简单。
pip install fireducks

安装 FireDucks(以及 pyarrow、pandas 和其他库)需要几分钟时间。

我尝试执行下面的代码,加载速度非常快,pandas 花了 4 秒,fireDucks 只花了 74.5 ns。

# 1. analysis based on time period and creative duration
# convert timestamp to date/time object
df['timestamp_converted'] = pd.to_datetime(df['timestamp'], unit='s ')

# define time period 
def get_part_of_day(hour): 
  if 5 <= hour < 12: 
    return 'morning'
  elif 12 <= hour < 17:
    return 'afternoon'
  else: 
    return 'evening'

# Add time period in new column 
df['part_of_day'] = df['timestamp_converted'].apply(lambda x: get_part_of_day(x.hour))

# Calculate average creative duration by time period 
df_ duration_by_time = df.groupby('part_of_day')['creative_duration'].mean() print(df_duration_by_time) 

# 2. campaign performance per different advertiser 
df_ campaigns_per_advertiser = df.groupby('advertiser_id')['campaign_id'].nunique() 
df_creatives_per_advertiser = df.groupby('advertiser_id ')['creatives_id'].nunique() 
print(df_campaigns_per_advertiser) 
print(df_creatives_per_advertiser)

# 3. language and website association 
df_common_website_ per_language = df.groupby('placement_language')['website_id'].apply(lambda x: x.mode()[0]) 
print(df_common_website_per_language) 

# 4. Analyze referrer information 
def extract_domain(referrer): 
  # if referrer is a float (e.g. NaN), return empty string 
  if isinstance(referrer, float): 
    return '' 
  # otherwise, extract domain name
  return referrer.split('/')[0] 

df['referrer_domain'] = df['referrer_deep_three'].apply(extract_domain) 
df_referrer_distribution = df['referrer_domain'].value_counts() 
print(df_referrer_distribution)


所有这些数据预处理和分析在 pandas 中大约需要 8 秒,而使用 FireDucks 时可以在 4 秒内完成。几乎可以实现 2 倍的速度。

提高性能

使用pandas最有压力的事情之一是加载大数据集时的等待,然后我必须等待像groupby这样的复杂操作。另一方面,由于FireDucks进行惰性评估,加载本身根本不需要时间,因此在需要的地方进行处理,我觉得这非常重要,大大减少了总等待时间。

至于其他性能,据该组织官方宣布,与 pandas 相比,似乎已经实现了高达 16 倍的速度提升。 (下次我会与各个竞争库进行性能比较。)

FireDucks: Get performance beyond pandas with zero learning cost!

零学习成本

能够遵循精确的 pandas 符号而无需考虑任何事情是一个巨大的优势。除了FireDucks之外,还有其他数据帧加速库,但它们学习成本太高,而且太容易忘记。

例如,如果你想添加带有极坐标的列,你必须这样写。

# pandas df["new_col"] = df["A"] + 1
# polars 
df = df.with_columns((pl.col("A") + 1).alias("new_col"))

几乎不需要更改现有代码

我有几个使用 pandas 的 ETL 和其他项目,如果仅通过安装 FireDucks 并替换 import 语句就能看到性能改进,那就太好了。

如果您想进一步添加,请随时在下面评论。

以上是FireDucks:以零学习成本获得超越 pandas 的性能!的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn