Python熊猫:是什么导致不同列选择方法的速度减慢?
在了解了如何在Pandas中复制类似SQL select语句的行为之后,我添加了两种方法来缩短问题中给出的详细语法 在使用它们之后,我的两个较短语法方法的速度明显较慢,我希望有人能解释原因 您可以假设下面使用的任何函数都来自Pandas、IPython或 我得到的结果是:Python熊猫:是什么导致不同列选择方法的速度减慢?,python,benchmarking,pandas,apply,Python,Benchmarking,Pandas,Apply,在了解了如何在Pandas中复制类似SQL select语句的行为之后,我添加了两种方法来缩短问题中给出的详细语法 在使用它们之后,我的两个较短语法方法的速度明显较慢,我希望有人能解释原因 您可以假设下面使用的任何函数都来自Pandas、IPython或 我得到的结果是: In [6]: %timeit _ = df[(df[1]==3) & (df[2]==2) & (df[4]==5)] 100 loops, best of 3: 4.91 ms per loop In [
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
我可以相信reduce、operator函数的用户,仅仅是我的pandas\u select函数的函数开销就可以让它变慢。但这似乎太过分了。在我的函数内部,我使用了相同的语法df[key]logical_op value,但速度要慢得多
我也很困惑,为什么沿axis=1的apply版本要慢得多。它实际上应该只是语法的缩短,不?当您编写df[df.applylambda 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操作都会快得多。当您编写df[df.applylambda 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操作都会快得多。此外,数据必须作为序列对象装箱,每行一个。此外,数据必须作为序列对象装箱,每行一个。
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