Skip to main content
 Web开发网 » 编程语言 » Python语言

Python使用Pandas读取数据库很慢,应该如何提速?

2021年11月27日15940百度已收录

谢邀!

Pandas编程库对数据科学界来说是一份天赐的礼物。无论你问哪一个数据科学家,他们是怎样使用Python处理他们的数据集,他们无疑都会谈到Pandas。

Pandas是一个伟大的编程库的缩影:简单、直观、功能广泛。

然而,对数据科学家的Pandas数据框进行数千甚至数百万次的计算,却仍然是一项挑战。你不能只是将数据放入编写Python for循环语句中,并期望在合理的时间内处理你的数据。

pandas是为一次性处理整个行或列的矢量化操作而设计的,循环在每个单元格、行或列中,但并不是设计使用库的方式。因此,在使用Pandas时,你应该考虑高度可并行化的矩阵运算法。

本指南将教你如何使用Pandas,它是被设计来使用和思考的矩阵运算。在此过程中,我将向你展示一些实用的且节省时间的技巧和窍门,这些技巧和窍门将使你的Pandas代码比那些可怕的Python for循环更快地运行!

我们的设置

在本教程中,我们将使用经典的Iris Flowers数据集。 让我们通过用seaborn加载的数据集并输入前5行来开始滚动。

Python使用Pandas读取数据库很慢,应该如何提速?  Python数据库操作 第1张

现在让我们构建一个基线,用Python for循环来测量我们的速度。我们将通过循环每一行来设置要在数据集上执行的计算,然后测量整个操作的速度。这将为我们提供一个基线,看看我们的新优化能在多大程度上帮助我们摆脱困境。

Python使用Pandas读取数据库很慢,应该如何提速?  Python数据库操作 第2张

在上面的代码中,我们创建了一个基本函数,它使用的是If-Else语句。我们编写了一个for循环,通过循环dataframe对每一行应用函数,然后测量循环的总运行时间。

在我的i7-8700k计算机上,循环运行5次平均需要0.01345秒。

循环语句.iterrows()

这是最简单但非常有价值的,可以加速使用Pandas内置的.iterrows()函数。

当我们在上一节中编写for循环时,我们使用了range()函数。 然而,当我们在Python中循环大量值时,生成器往往要快得多。在本文中,你可以阅读更多关于生成器是如何工作的信息,并还会使其运行得更快。

Pandas的.iterrows()函数在内部实现了一个生成器函数,它将在每次迭代时产生一行Dataframe。更确切地说,.iterrows()为DataFrame中的每一行产生(index, Series)元组。 这实际上与在原始Python中使用enumerate()之类的东西相同,但运行速度要快得多。

下面我们修改了代码,使用.iterrows()而不是常规的for循环。 在我上一节用于测试的完全相同的机器上,平均运行时间为0.005892秒 - 加速2.28倍!

Python使用Pandas读取数据库很慢,应该如何提速?  Python数据库操作 第3张

使用.apply()完全删除循环

.iterrows()函数给我们带来了很大的提升速度,但是我们还远远没有完成。请始终记住,当使用专为矢量操作设计的库时,可能有一种方法可以在没有for循环的情况下最有效地完成任务。

为我们提供此功能的Pandas功能是.apply()函数。我们的function.apply()接受另一个函数作为其输入,并沿着DataFrame的轴(行、列等)应用它。 在我们传递函数的情况下,lambda通常可以方便地将所有内容打包在一起。

在下面的代码中,我们已经完全用.apply()和lambda函数替换了我们的for循环来打包我们想要的计算。在我的机器上,此代码的平均运行时间为0.0020897秒 ,比我们原来的for循环速度快了6.44倍。

Python使用Pandas读取数据库很慢,应该如何提速?  Python数据库操作 第4张

apply()之所以这么快,是因为它在内部尝试了Cython迭代器。如果你的函数恰好针对Cython进行了优化,那么.apply()将为您带来更大的速度。还有额外的一点好处是,使用内置函数可以生成更干净、更易读的代码。

最后

前面我提到过,如果你正在使用一个为向量化操作设计的库,那么你应该始终寻找一种不使用for循环去进行计算的方法。

同样,有许多以这种方式设计的库,包括pandas,将具有方便的内置函数,可以执行你正在寻找的精确计算,并且速度更快。

来自Pandas的.cut()函数将一组bin定义为输入,这些bin定义了If-Else的每个范围和每一组标签,这些标签定义了每个范围返回的值。 然后它执行我们使用compute_class()函数,且手动编写的完全相同的操作。

查看下面的代码,了解.cut()的工作原理。 我们再次获得了更清晰、更易读的代码所带来的好处。 最后,.cut()函数平均运行0.001423秒 , 比原来的for循环快了9.39倍!

Python使用Pandas读取数据库很慢,应该如何提速?  Python数据库操作 第5张

更多有关人工智能的资讯、深度报道、采访欢迎关注AI中国,无论你是小白还是大神,你想要的这里都有!

评论列表暂无评论
发表评论
微信