Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python熊猫:是什么导致不同列选择方法的速度减慢?_Python_Benchmarking_Pandas_Apply - Fatal编程技术网

Python熊猫:是什么导致不同列选择方法的速度减慢?

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 [

在了解了如何在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 [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