pandas、numpy是Python数据科学中非常常用的库,numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更高效。pandas是基于numpy的数据处理工具,能更方便的操作大型表格类型的数据集。但是,随着数据量的剧增,有时numpy和pandas的速度就成瓶颈。

如下我们会介绍一些优化秘籍:里面包含了 代码层面的优化,以及可以无脑使用的性能优化扩展包。

1、NumExpr

NumExpr 是一个对NumPy计算式进行的性能优化。NumExpr的使用及其简单,只需要将原来的numpy语句使用双引号框起来,并使用numexpr中的evaluate方法调用即可。经验上看,数据有上万条+ 使用NumExpr才比较优效果,对于简单运算使用NumExpr可能会更慢。如下较复杂计算,速度差不多快了5倍。

import numexpr as neimport numpy as npa = np.linspace(0,1000,1000) print('# numpy十次幂计算')
%timeit a**10print('# numexpr十次幂计算')
%timeit ne.evaluate('a**10')

2、Numba

Numba 使用行业标准的LLVM编译器库在运行时将 Python 函数转换为优化的机器代码。Python 中 Numba 编译的数值算法可以接近 C 或 FORTRAN 的速度。

如果在你的数据处理过程涉及到了大量的数值计算,那么使用numba可以大大加快代码的运行效率(一般来说,Numba 引擎在处理大量数据点 如 1 百万+ 时表现出色)。numba使用起来也很简单,因为numba内置的函数本身是个装饰器,所以只要在自己定义好的函数前面加个@nb.方法就行,简单快捷!

# pip install numbaimport numba as nb# 用numba加速的求和函数
@nb.jit()
def nb_sum(a):Sum = 0for i in range(len(a)):Sum += a[i]return Sum# 没用numba加速的求和函数
def py_sum(a):Sum = 0for i in range(len(a)):Sum += a[i]return Sumimport numpy as np
a = np.linspace(0,1000,1000) # 创建一个长度为1000的数组
print('# python求和函数')
%timeit sum(a)
print('# 没加速的for循环求和函数')
%timeit py_sum(a)
print('# numba加速的for循环求和函数')
%timeit nb_sum(a)
print('# numpy求和函数')
%timeit np.sum(a)

当前示例可以看出,numba甚至比号称最接近C语言速度运行的numpy还要快5倍+,对于python求和速度快了几百倍。。

此外,Numba还支持GPU加速、矢量化加速方法,可以进一步达到更高的性能。

from numba import cuda
cuda.select_device(1)@cuda.jit
def CudaSquare(x):i, j = cuda.grid(2)x[i][j] *= x[i][j]#numba的矢量化加速
from math import sin
@nb.vectorize()
def nb_vec_sin(a):return sin(a)

3、CuPy

CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

# pip install cupy
import numpy as np
import cupy as cp
import time### numpy
s = time.time()
x_cpu = np.ones((1000,1000,1000))
e = time.time()
print(e - s)### CuPy
s = time.time()
x_gpu = cp.ones((1000,1000,1000))
e = time.time()
print(e - s)

上述代码,Numpy 创建(1000, 1000, 1000)的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。随着数据量的猛增,CuPy的性能提升会更为明显。

4、pandas使用技巧

更多pandas性能提升技巧请戳官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html

4.1 按行迭代优化

我们按行对dataframe进行迭代,一般我们会用iterrows这个函数。在新版的pandas中,提供了一个更快的itertuples函数,如下可以看到速度快了几十倍。

import pandas as pd
import numpy as np
import time
df = pd.DataFrame({'a': np.random.randn(100000),'b': np.random.randn(100000),'N': np.random.randint(100, 1000, (100000)),'x':  np.random.randint(1, 10, (100000))})%%timeit
a2=[]
for row in df.itertuples():temp=getattr(row, 'a')a2.append(temp*temp)
df['a2']=a2
%%timeit
a2=[]
for index,row in df.iterrows():temp=row['a']a2.append(temp*temp)
df['a2']=a2

4.2 apply、applymap优化

当对于每行执行类似的操作时,用循环逐行处理效率很低。这时可以用apply或applymap搭配函数操作,其中apply是可用于逐行计算,而applymap可以做更细粒度的逐个元素的计算。

# 列a、列b逐行进行某一函数计算
df['a3']=df.apply( lambda row: row['a']*row['b'],axis=1)
# 逐个元素保留两位小数
df.applymap(lambda x: "%.2f" % x)

4.3 聚合函数agg优化

对于某列将进行聚合后,使用内置的函数比自定义函数效率更高,如下示例速度加速3倍

%timeit  df.groupby("x")['a'].agg(lambda x:x.sum())%timeit  df.groupby("x")['a'].agg(sum)%timeit  df.groupby("x")['a'].agg(np.sum)

4.4 文件操作

pandas读取文件,pkl格式的数据的读取速度最快,其次是hdf格式的数据,再者是读取csv格式数据,而xlsx的读取是比较慢的。但是存取csv有个好处是,这个数据格式通用性更好,占用内存硬盘资源也比较少。此外,对于大文件,csv还可以对文件分块、选定某几列、指定数据类型做读取。

4.5 pandas.eval

pandas.eval 是基于第一节提到的numexpr,pandas也是基于numpy开发的,numexpr同样可以被用来对pandas加速)。使用eval表达式的一个经验是数据超过 10,000 行的情况下使用会有明显优化效果。

import pandas as pd
nrows, ncols = 20000, 100
df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols)) for _ in range(4)]print('pd')
%timeit df1 + df2 + df3 + df4
print('pd.eval')
%timeit pd.eval("df1 + df2 + df3 + df4")

5、Cython优化

Cython是一个基于C语言的Python 编译器,在一些计算量大的程序中,可以Cython来实现相当大的加速。考虑大部分人可能都不太了解复杂的cython语句,下面介绍下Cython的简易版使用技巧。通过在Ipython加入 Cython 魔术函数%load_ext Cython,如下示例就可以加速了一倍。进一步再借助更高级的cython语句,还是可以比Python快个几十上百倍。

%%cython
def f_plain(x):return x * (x - 1)
def integrate_f_plain(a, b, N):s = 0dx = (b - a) / Nfor i in range(N):s += f_plain(a + i * dx)return s * dx

6、swifter

swifter是pandas的插件,可以直接在pandas的数据上操作。Swifter的优化方法检验计算是否可以矢量化或者并行化处理,以提高性能。如常见的apply就可以通过swifter并行处理。

import pandas as pd
import swifterdf.swifter.apply(lambda x: x.sum() - x.min())

7、Modin

Modin后端使用dask或者ray(dask是类似pandas库的功能,可以实现并行读取运行),是个支持分布式运行的类pandas库,简单通过更改一行代码import modin.pandas as pd就可以优化 pandas,常用的内置的read_csv、concat、apply都有不错的加速。注:并行处理的开销会使小数据集的处理速度变慢。

!pip install modin
import pandas
import modin.pandas as pd
import time## pandaspandas_df = pandas.DataFrame({'a': np.random.randn(10000000),'b': np.random.randn(10000000),'N': np.random.randint(100, 10000, (10000000)),'x':  np.random.randint(1, 1000, (10000000))})start = time.time()big_pandas_df = pandas.concat([pandas_df for _ in range(25)])end = time.time()
pandas_duration = end - start
print("Time to concat with pandas: {} seconds".format(round(pandas_duration, 3)))#### modin.pandas
modin_df = pd.DataFrame({'a': np.random.randn(10000000),'b': np.random.randn(10000000),'N': np.random.randint(100, 10000, (10000000)),'x':  np.random.randint(1, 1000, (10000000))})start = time.time()
big_modin_df = pd.concat([modin_df for _ in range(25)])end = time.time()
modin_duration = end - start
print("Time to concat with Modin: {} seconds".format(round(modin_duration, 3)))print("Modin is {}x faster than pandas at `concat`!".format(round(pandas_duration / modin_duration, 2)))

推荐文章

  • 李宏毅《机器学习》国语课程(2022)来了

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

Pandas、Numpy 性能优化秘籍(全)相关推荐

  1. 【Python】Pandas、Numpy性能优化秘籍(全)

    pandas.numpy是Python数据科学中非常常用的库,numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更高效.pandas是基于numpy的数据处理工具,能更方便的 ...

  2. Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道

    Linux C++性能优化秘籍:从编译器到代码,揭秘高性能C++程序的实现之道 引言 性能优化的重要性 Linux环境下C++程序的特点 高性能C++编程的核心要点 编译器优化 GCC与Clang编译 ...

  3. 一口气搞懂「Flink Metrics」监控指标和性能优化,全靠这33张图和7千字(建议收藏)

    前言 大家好,我是土哥. 最近在公司做 Flink 推理任务的性能测试,要对 job 的全链路吞吐.全链路时延.吞吐时延指标进行监控和调优,其中要使用 Flink Metrics 对指标进行监控. 接 ...

  4. Android的性能优化,全方面给你讲明白

    前言: 作为Android系统的使用者,我们经常会遇到图片加载速度慢.甚至长时间无响应,软件使用不流畅.甚至经常性卡退等问题,这些都是Android开发师需要进一步改进的地方,正是如此,公司对安卓项目 ...

  5. 浅谈一下在阿里工作的前端性能优化的全链路经验

    在阿里做性能优化也有一段时间了,那就总结一下前端常见的优化内容吧 首先作为一个前端工程师,要明白性能优化的重要性以及必要性,基本都涵盖了从开发.打包构建.以及前端工程化模块化等等一系列内容,不光可以提 ...

  6. [转]numpy性能优化

    转自:http://blog.csdn.net/pipisorry/article/details/39087583 http://blog.csdn.net/pipisorry/article/de ...

  7. 【独家】让你一次性掌握Neo4j性能优化秘籍的三大狠招

    作者| 西湖数据智能研究院高级研发工程师 无极 大千世界纷繁复杂,万物之间总会有千丝万缕的关系.随着现代商业社会的发展,事物的关联关系越发错综复杂,传统的关系存储已经不能满足我们的业务需求." ...

  8. Android界面性能优化最全总结、原理剖析

     界面是 Android 应用中直接影响用户体验最关键的部分.如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存. 我司这类做 ROM 的公司更不一样,预装的应用一定要非常流畅,这样给客户 ...

  9. Hive性能优化秘籍

    1. Fetch抓取 Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算.例如:SELECT * FROM employees; 在这种情况下,Hive 可以简单 ...

最新文章

  1. c#设计模式-工厂方法
  2. JavaScript数据结构和算法
  3. java水晶报表pull模式_水晶报表pull模式
  4. 截取字符串_jquery截取字符串中的数字
  5. Fiori UI上创建的note和web client UI上note的对应关系
  6. 文献管理工具Zotero
  7. 数据库入门开发案例,真的是入门级别的!!看了不后悔。
  8. NFT推动全球加密艺术浪潮
  9. linux下查看已经安装的jdk 并卸载jdk的方法
  10. oracle12c 常用视图,oracle12c v$sql视图字段全解
  11. 如何写好一篇综述类论文?
  12. [转载]SEO新足域名选择心决
  13. 共享单车之数据可视化
  14. Flink 最佳实践之使用 Canal 同步 MySQL 数据至 TiDB
  15. [转]Linux主机驱动与外设驱动分离思想
  16. python小游戏——猜单词游戏(Hangman)
  17. linux查看系统硬件温度
  18. 呵护身体10个部位的最佳食物!
  19. 北大方正集团收入突破千亿,在中国企业500强排名提升24位
  20. 怎么翻译截图里面的文字?快来看看截图翻译怎么弄

热门文章

  1. 实现扫描图片出现3d模型的虚拟仿真技术
  2. 计算机网络又称为分时多用户,计算机网络与通讯题库一(教学资料)
  3. MySQLamp;amp;JDBC回顾——MySQL
  4. ✨ StarRocks 6 月社区动态
  5. 不同平台下移植x264
  6. 三大电信公司同领TDS牌照可能性最大
  7. “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则
  8. Python 3 怎么快速搭建服务器
  9. 运维日常之机房浪潮服务器硬盘红灯亮起,服务器一直响,raid磁盘红色。。。故障解决方法...
  10. 服务器知识:关于阿里云服务器域名备案内容