Python科学计算(金融)包Pandas性能测试之一 – Python量化投资

Python科学计算(金融)包Pandas性能测试之一

line_profiler:Python性能分析工具

1、介绍与安装

其可以分析函数内部每一行代码的执行次数、耗时总时间、单次耗时等信息。对分析代码执行效率有极大的帮助。

安装命令:

pip install line_profiler


2、使用方式

当在命令行执行时,不需要导入,直接在函数的上一行加上@profile即可。

然后在命令行执行如下命令:kernprof -l -v [source_code.py],会生成对应的文件在运行目录。

在这个命令中,添加-v参数会在执行结束后显示结果。如果不添加,则会生成同名的且后缀为.prof的结果文件。

结果文件查看方式:python -m pstats source_code.py.prof

 

Pandas的DataFrame效率测试

新建一个模块文件main.py,其中入口处导入我们的武器————>

import pandas as pd
import numpy as np

生成100000行的的DataFrame,设置部分值为空值:

# 构建数据
data = pd.DataFrame(np.random.random(100000), columns=['value'])
data[(data>0.5) & (data<0.7)] = np.nan

几个对比:1、ix与iloc与loc
 

@profile
def dataindex1(data):
    for i in range(len(data)):
        tmp = data.ix[i]
@profile   
def dataindex2(data):
    for i in range(len(data)):
        tmp = data.loc[i]
@profile
def dataindex3(data):
    for i in range(len(data)):
        tmp = data.iloc[i]
@profile  
def testindex(data):
    dataindex1(data)
    dataindex2(data)
    dataindex3(data)

执行结果:

Total time: 22.3295 s
File: main.py
Function: dataindex1 at line 43

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    43                                           @profile
    44                                           def dataindex1(data):
    45    100001       268767      2.7      0.4      for i in range(len(data)):
    46    100000     69352839    693.5     99.6          tmp = data.ix[i]

Total time: 22.8208 s
File: main.py
Function: dataindex2 at line 47

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    47                                           @profile
    48                                           def dataindex2(data):
    49    100001       267687      2.7      0.4      for i in range(len(data)):
    50    100000     70886048    708.9     99.6          tmp = data.loc[i]

Total time: 18.7156 s
File: main.py
Function: dataindex3 at line 51

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    51                                           @profile
    52                                           def dataindex3(data):
    53    100001       266175      2.7      0.5      for i in range(len(data)):
    54    100000     58087716    580.9     99.5          tmp = data.iloc[i]

Total time: 64.1344 s
File: main.py
Function: testindex at line 55

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    55                                           @profile
    56                                           def testindex(data):
    57         1     69898530 69898530.0     35.0      dataindex1(data)
    58         1     71431458 71431458.0     35.7      dataindex2(data)
    59         1     58636406 58636406.0     29.3      dataindex3(data)

 

2、~pd.isnull  和直接xxx.dropna()

@profile
def delna1(nv):
    # 通过自带函数删除
    nv.dropna(inplace=True)
    return nv
@profile
def delna2(nv):
    # 通过自带函数删除
    nv = nv.dropna()
    return nv
    
@profile
def delna3(nv):
    # 通过自带函数删除
    nv = nv[~pd.isnull(nv)]
    return nv

#%%
@profile
def testdel(data):
    for i in range(10000):
        delna1(data['value'])
        delna2(data['value'])
        delna3(data['value'])

运行结果:

Wrote profile results to main.py.lprof
Timer unit: 3.20726e-07 s

Total time: 11.4889 s
File: main.py
Function: delna1 at line 17

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    17                                           @profile
    18                                           def delna1(nv):
    19                                               # 通过自带函数删除
    20     10000     35786911   3578.7     99.9      nv.dropna(inplace=True)
    21     10000        34624      3.5      0.1      return nv

Total time: 11.0455 s
File: main.py
Function: delna2 at line 22

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    22                                           @profile
    23                                           def delna2(nv):
    24                                               # 通过自带函数删除
    25     10000     34400689   3440.1     99.9      nv = nv.dropna()
    26     10000        38328      3.8      0.1      return nv

Total time: 36.365 s
File: main.py
Function: delna3 at line 28

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    28                                           @profile
    29                                           def delna3(nv):
    30                                               # 通过自带函数删除
    31     10000    113330628  11333.1    100.0      nv = nv[~pd.isnull(nv)]
    32     10000        52811      5.3      0.0      return nv

Total time: 59.6401 s
File: main.py
Function: testdel at line 35

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    35                                           @profile
    36                                           def testdel(data):
    37     10001        29704      3.0      0.0      for i in range(10000):
    38     10000     36581703   3658.2     19.7          delna1(data[‘value’])
    39     10000     35152146   3515.2     18.9          delna2(data[‘value’])
    40     10000    114189929  11419.0     61.4          delna3(data[‘value’])

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论