ely*_*ely 1 python benchmarking apply pandas
在看到这个问题,有关大熊猫复制SQL选择语句类似的行为,我说这个答案显示,可以缩短在给出的详细的语法两种方式接受的答案这个问题.
在使用它们之后,我的两个较短的语法方法明显变慢,我希望有人可以解释原因
您可以假设下面使用的任何函数都来自Pandas,IPython或上面链接的问题和答案.
import pandas
import numpy as np
N = 100000
df = pandas.DataFrame(np.round(np.random.rand(N,5)*10))
def pandas_select(dataframe, select_dict):
inds = dataframe.apply(lambda x: reduce(lambda v1,v2: v1 and v2,
[elem[0](x[key], elem[1])
for key,elem in select_dict.iteritems()]), axis=1)
return dataframe[inds]
%timeit _ = df[(df[1]==3) & (df[2]==2) & (df[4]==5)]
%timeit _ = df[df.apply(lambda x: (x[1]==3) & (x[2]==2) & (x[4]==5), axis=1)]
import operator
select_dict = {1:(operator.eq,3), 2:(operator.eq,2), 4:(operator.eq,5)}
%timeit _ = pandas_select(df, select_dict)
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
In [6]: %timeit _ = df[(df[1]==3) & (df[2]==2) & (df[4]==5)]
100 loops, best of 3: 4.91 ms per loop
In [7]: %timeit _ = df[df.apply(lambda x: (x[1]==3) & (x[2]==2) & (x[4]==5), axis=1)]
1 loops, best of 3: 1.23 s per loop
In [10]: %timeit _ = pandas_select(df, select_dict)
1 loops, best of 3: 1.6 s per loop
Run Code Online (Sandbox Code Playgroud)
我可以买到我的函数的用户reduce,operator函数和函数开销pandas_select可能会降低它的速度.但似乎过分了.在我的函数内部,我使用相同的语法df[key] logical_op value,但速度要慢得多.
我也很困惑为什么apply版本axis=1会慢得多.它应该只是缩短语法,不是吗?
在编写时df[df.apply(lambda x: (x[1]==3) & (x[2]==2) & (x[4]==5), axis=1)],您将为数据框中的每个100000行调用lambda.这有很大的开销,因为必须为每一行执行Python方法调用.
当你写作时df[(df[1]==3) & (df[2]==2) & (df[4]==5)],没有开销; 相反,该操作在单个操作中应用于每个列,并且循环在具有矢量化潜力的本机代码中执行(例如SSE).
这不是熊猫独有的; 一般来说,如果你在聚合中处理数组和矩阵而不是在单个项上调用Python函数或内部循环,那么任何numpy操作都会快得多.
| 归档时间: |
|
| 查看次数: |
1080 次 |
| 最近记录: |