python-faster-pandas-skills

本文最后更新于:2023年6月19日 晚上

numba 加速

原文链接:https://zhuanlan.zhihu.com/p/78882641
使用 numba 非常简单,只需要将 numba 装饰器应用到 python 函数中,无需改动原本的 python 代码,numba 会自动完成剩余的工作。

1
2
3
4
5
6
7
8
9
10
import numpy as np
import numba
from numba import jit
@jit(nopython=True) # jit,numba装饰器中的一种
def go_fast(a): # 首次调用时,函数被编译为机器代码
trace = 0
# 假设输入变量是numpy数组
for i in range(a.shape[0]): # Numba 擅长处理循环
trace += np.tanh(a[i, i])
return a + trace

以上代码是一个 python 函数,用以计算 numpy 数组各个数值的双曲正切值,我们使用了 numba 装饰器,它将这个 python 函数编译为等效的机器代码,可以大大减少运行时间。

什么情况下使用 numba 呢?

  • 使用 numpy 数组做大量科学计算时

  • 使用 for 循环时

Vaex-大数据

pandas 能应付较大数据集(千万行级别),但当数据量达到十亿百亿行级别,pandas 处理起来就有点力不从心了,可以说非常的慢。
官网对 vaex 的介绍可以总结为三点:

  1. vaex 是一个用处理、展示数据的数据表工具,类似 pandas;
  2. vaex 采取内存映射、惰性计算,不占用内存,适合处理大数据;
  3. vaex 可以在百亿级数据集上进行秒级的统计分析和可视化展示;

vaex 的优势在于:

  1. 性能:处理海量数据, 行/秒;
  2. 惰性:快速计算,不占用内存;
  3. 零内存复制:在进行过滤/转换/计算时,不复制内存,在需要时进行流式传输;
  4. 可视化:内含可视化组件;
  5. API:类似 pandas,拥有丰富的数据处理和计算函数;
  6. 可交互:配合 Jupyter notebook 使用,灵活的交互可视化;

vaex 支持读取 hdf5、csv、parquet 等文件,使用 read 方法。hdf5 可以惰性读取,而 csv 只能读到内存中。

读取数据

image.png

数据处理

有时候我们需要对数据进行各种各样的转换、筛选、计算等,pandas 的每一步处理都会消耗内存,而且时间成本高。除非说使用链式处理,但那样过程就很不清晰。
vaex 则全过程都是零内存。因为它的处理过程仅仅产生 expression(表达式),表达式是逻辑表示,不会执行,只有到了最后的生成结果阶段才会执行。而且整个过程数据是流式传输,不会产生内存积压。
image.png

vaex 的统计计算函数:
image.png

可视化展示

vaex 还可以进行快速可视化展示,即便是上百亿的数据集,依然能秒出图。
image.png
vaex 可视化函数:
image.png
附:hdf5 数据集生成代码(4 列 1 亿行数据)

1
2
3
4
5
import pandas as pd
import vaex
df = pd.DataFrame(np.random.rand(100000000,4),columns=['col_1','col_2','col_3','col_4'])
df.to_csv('example.csv',index=False)
vaex.read('example.csv',convert='example1.hdf5')

注意这里不要用 pandas 直接生成 hdf5,其格式会与 vaex 不兼容。