【附代码】NumPy加速库NumExpr(大数据)

文章目录

作者:小猪快跑

基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!------@小猪快跑

相关文献

测试电脑配置

博主三千元电脑的渣渣配置:

CPU model: AMD Ryzen 7 7840HS w/ Radeon 780M Graphics, instruction set SSE2\|AVX\|AVX2\|AVX512

Thread count: 8 physical cores, 16 logical processors, using up to 16 threads

数组加减乘除

我们计算 2 * a + 3 * b,发现在数据量较大时候,NumExpr明显快于NumPy

python 复制代码
import perfplot
from matplotlib import pyplot as plt
import numpy as np
import numexpr as ne


def numpy_add(a, b):
    return 2 * a + 3 * b


def numexpr_add(a, b):
    return ne.evaluate("2 * a + 3 * b")


if __name__ == '__main__':
    b = perfplot.bench(
        setup=lambda n: (np.random.rand(n), np.random.rand(n)),
        kernels=[
            numpy_add,
            numexpr_add,
        ],
        n_range=[2 ** k for k in range(25)],
        xlabel="length of DataFrame",
    )

    plt.figure(dpi=300)
    b.save(f"arr_add.png")
    b.show()

数组乘方

我们计算 2 * a + b ** 10,发现在数据量较大时候,NumExpr明显快于NumPy

python 复制代码
import perfplot
from matplotlib import pyplot as plt
import numpy as np
import numexpr as ne


def numpy_power(a, b):
    return 2 * a + b ** 10


def numexpr_power(a, b):
    return ne.evaluate("2 * a + b ** 10")


if __name__ == '__main__':
    b = perfplot.bench(
        setup=lambda n: (np.random.rand(n), np.random.rand(n)),
        kernels=[
            numpy_power,
            numexpr_power,
        ],
        n_range=[2 ** k for k in range(25)],
        xlabel="length of DataFrame",
    )

    plt.figure(dpi=300)
    b.save(f"arr_power.png")
    b.show()

Pandas加减乘除

我们计算 (a + b) / (c - 1),发现在数据量较大时候,NumExpr明显快于Pandas

python 复制代码
import pandas as pd
import perfplot
from matplotlib import pyplot as plt
from numpy.random._examples.cffi.extending import rng
import numexpr as ne


def pandas_add(df):
    return (df['A'] + df['B']) / (df['C'] - 1)


def numexpr_add(df):
    return df.eval('(A + B) / (C - 1)')


def numpy_arr_add(df):
    a = df['A'].values
    b = df['B'].values
    c = df['C'].values
    return (a + b) / (c - 1)


def numexpr_arr_add(df):
    a = df['A'].values
    b = df['B'].values
    c = df['C'].values
    return ne.evaluate("(a + b) / (c - 1)")


if __name__ == '__main__':
    b = perfplot.bench(
        setup=lambda n: pd.DataFrame(rng.random((n, 3)), columns=['A', 'B', 'C']),
        kernels=[
            pandas_add,
            numexpr_add,
            numpy_arr_add,
            numexpr_arr_add,
        ],
        n_range=[2 ** k for k in range(25)],
        xlabel="length of DataFrame",
    )

    plt.figure(dpi=300)
    b.save(f"pandas_add.png")
    b.show()

总结

总体来说在大数据下会有多倍的性能提升。但我们也容易观察到,就算10e8量级的数据,进行一次运算的时间也不超过1秒。一般计算次数多,数据量大,对速度有要求的场景下可以使用。

相关推荐
RD_daoyi19 小时前
Google SEO 第六周:外链建设与网站权重提升 —— 让排名直冲首页的终极推力
大数据·学习·搜索引擎
段一凡-华北理工大学19 小时前
工业领域的Hadoop架构学习~系列文章17:Hadoop性能调优- 调度集群每一分性能
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
KaMeidebaby19 小时前
卡梅德生物技术快报|蛋白定制:ACE 抑制肽原辅料工艺全参数|适配蛋白定制的提取 & 酶解标准化实操手册
大数据·人工智能·架构·spark·新浪微博
团象科技19 小时前
中小出海团队运维观察:WordPress站点境外云环境搭建实操路径梳理
大数据·运维·人工智能
沐籽李19 小时前
Proteina-Complexa:NVIDIA 如何把蛋白 Binder 设计推进到全原子生成时代?
大数据·人工智能·算法·英伟达·蛋白质生成
无忧智库19 小时前
服饰行业数字化转型:服饰企业供应链高效数字化管理方案(PPT)
大数据
孟俊宇-MJY19 小时前
CSDN AI数字营销内容创作功能测评
大数据·人工智能
Jelena1577958579219 小时前
主流电商平台(淘宝/1688/京东/拼多多)商品比价与数据分析实战指南
大数据·人工智能·数据分析
其利天下技术19 小时前
第三代半导体“碳化硅(SiC)器件”基础知识详解--【其利天下】
大数据·人工智能·第三代半导体·碳化硅技术及其运用·其利天下技术
跨境小彭20 小时前
2026跨境电商精细化洗牌:破解利润核算与多店运维痛点,实操工具全解析
大数据·运维·信息可视化·跨境电商·temu·temu电商运营