本文就Pandas的运行效率作一个对比的测试,来探讨用哪些方式,会使得运行效率较好。

测试环境如下:

  • windows 7, 64位
  • python 3.5
  • pandas 0.19.2
  • numpy 1.11.3
  • jupyter notebook

需要说明的是,不同的系统,不同的电脑配置,不同的软件环境,运行结果可能有些差异。就算是同一台电脑,每次运行时,运行结果也不完全一样。

1 测试内容

测试的内容为,分别用三种方法来计算一个简单的运算过程,即 a*a+b*b 。

三种方法分别是:

  1. python的for循环
  2. Pandas的Series
  3. Numpy的ndarray

首先构造一个DataFrame,数据量的大小,即DataFrame的行数,分别为10, 100, 1000, … ,直到10,000,000(一千万)。

然后在jupyter notebook中,用下面的代码分别去测试,来查看不同方法下的运行时间,做一个对比。

import pandas as pd
import numpy as np # 100分别用 10,100,...,10,000,000来替换运行
list_a = list(range(100))
# 200分别用 20,200,...,20,000,000来替换运行
list_b = list(range(100,200))
print(len(list_a))
print(len(list_b)) df = pd.DataFrame({'a':list_a, 'b':list_b})
print('数据维度为:{}'.format(df.shape))
print(len(df))
print(df.head())
100
100
数据维度为:(100, 2)
100
a b
0 0 100
1 1 101
2 2 102
3 3 103
4 4 104
  • 执行运算, a*a + b*b

  • Method 1: for循环

%%timeit

# 当DataFrame的行数大于等于1000000时,请用 %%time 命令
for i in range(len(df)):
df['a'][i]*df['a'][i]+df['b'][i]*df['b'][i]
100 loops, best of 3: 12.8 ms per loop
  • Method 2: Series
type(df['a'])
pandas.core.series.Series
%%timeit
df['a']*df['a']+df['b']*df['b']
The slowest run took 5.41 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 669 µs per loop
  • Method 3: ndarray
type(df['a'].values)
numpy.ndarray
%%timeit
df['a'].values*df['a'].values+df['b'].values*df['b'].values
10000 loops, best of 3: 34.2 µs per loop

2 测试结果

运行结果如下:

从运行结果可以看出,for循环明显比Series和ndarray要慢很多,并且数据量越大,差异越明显。当数据量达到一千万行时,for循环的表现也差一万倍以上。 而Series和ndarray之间的差异则没有那么大。

PS: 1000万行时,for循环运行耗时特别长,各位如果要测试,需要注意下,请用 %%time 命令(只测试一次)。

下面通过图表来对比下Series和ndarray之间的表现。

从上图可以看出,当数据小于10万行时,ndarray的表现要比Series好些。而当数据行数大于100万行时,Series的表现要稍微好于ndarray。当然,两者的差异不是特别明显。

所以一般情况下,个人建议,for循环,能不用则不用,而当数量不是特别大时,建议使用ndarray(即df[‘col’].values)来进行计算,运行效率相对来说要好些。

Python: Pandas运算的效率探讨以及如何选择高效的运算方式的更多相关文章

  1. 看到篇博文,用python pandas改写了下

    看到篇博文,https://blog.csdn.net/young2415/article/details/82795688 需求是需要统计部门礼品数量,自己简单绘制了个表格,如下: 大意是,每个部门 ...

  2. Python pandas & numpy 笔记

    记性不好,多记录些常用的东西,真·持续更新中::先列出一些常用的网址: 参考了的 莫烦python pandas DOC numpy DOC matplotlib 常用 习惯上我们如此导入: impo ...

  3. python & pandas链接mysql数据库

    Python&pandas与mysql连接 1.python 与mysql 连接及操作,直接上代码,简单直接高效: import MySQLdb try: conn = MySQLdb.con ...

  4. Python基础-类的探讨(class)

    Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python ...

  5. Python pandas ERROR 2006 (HY000): MySQL server has gone away

    之前在做python pandas大数据分析的时候,在将分析后的数据存入mysql的时候报ERROR 2006 (HY000): MySQL server has gone away 原因分析:在对百 ...

  6. Python+Pandas 读取Oracle数据库

    Python+Pandas 读取Oracle数据库 import pandas as pd from sqlalchemy import create_engine import cx_Oracle ...

  7. Python pandas快速入门

    Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...

  8. python. pandas(series,dataframe,index) method test

    python. pandas(series,dataframe,index,reindex,csv file read and write) method test import pandas as ...

  9. oracle数据据 Python+Pandas 获取Oracle数据库并加入DataFrame

    import pandas as pd import sys import imp imp.reload(sys) from sqlalchemy import create_engine impor ...

随机推荐

  1. Lambda类库篇 —— Streams API, Collector和并行

    本文是深入理解Java 8 Lambda系列的第二篇,主要介绍Java 8针对新增语言特性而新增的类库(例如Streams API.Collectors和并行). 本文是对 Brian Goetz 的 ...

  2. Java微服务框架

    Java的微服务框架dobbo.spring boot.redkale.spring cloud 消息中间件RabbitMQ.Kafka.RocketMQ

  3. iOS安全攻防之反编译

    Class-dump 进行反编译: 之前做代码混淆, 首先了解了下反编译,使用入门级的反编译 class-dump.下载地址:最新版Class-dump. 首先需要注意的是,class-dump的作用 ...

  4. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  5. GPU编程--kernels(2)

    "如何区分不同的数据单位单位呢?" "如何确定程序是在CPU端执行,还是GPU端执行呢?" "如何确定要调用的GPU线程数呢?" 下面举一个 ...

  6. Java中4种类型的内部类 .

    在Java中有4种不同类型的内部类可以使用.下面给出它们的名称和例子. 1.静态嵌套类(Static Nested Classes) class Outer { static class Inner  ...

  7. java基础-四种方法引用

    实例 直接三角形,通过两边算第三边,目的是为了如何使用这几种方法引用.代码中多有些不合适,尽情原谅. 静态方法引用 接口的参数列表与类中的具体实现方法的参数列表一样,返回值一致. 调用 //静态引用 ...

  8. PHPstrom的Disable Power Save Mode

    1.安装好phpstorm之后 发现代码高亮和函数自动提示都失效了 网上有人说可能是Power save mode的原因开始没找到这个设置在哪 后来在底部面板的信息提示处发现有一条系统消息: 17:0 ...

  9. comm的用法

    1.comm的功能 对两个排序过的文本文件进行逐行比较基本用法:comm -[123] file1 file2 2.例子 1)显示两个文本文件都有的行#comm -12 file1 file2 2)显 ...

  10. Java NIO学习笔记 NIO选择器

    Java NIO选择器 A Selector是一个Java NIO组件,可以检查一个或多个NIO通道,并确定哪些通道已准备就绪,例如读取或写入.这样一个线程可以管理多个通道,从而管理多个网络连接. 为 ...