图片来自Frank Andrade的Shutterstock授权
Python因其速度较慢而闻名。虽然Python比其他语言慢是事实,但是有一些方法可以加速我们的Python代码。
如何加速?简单,优化你的代码。
如果我们编写的代码占用的内存和存储空间很少,不仅可以完成任务,还可以使Python代码运行更快。
下面是我在我参加的Python课程中学到的一个快速和超快速的Python循环方式(我们永远不会停止学习!)。
普通循环
假设我们想求1到100000000的数字之和(我们可能永远不会这样做,但这个大数字可以帮助我说明问题)。
一种典型的方法是创建一个变量total_sum=0
,循环遍历范围并在每次迭代中将total_sum
的值递增i
。
这可以完成任务,但需要约6.58秒的时间。
虽然现在看起来不太慢,但当你在范围内添加更多的0时,它会变得更慢。
让我们加速一下!
使用内置函数更快地循环
在Python中更快的循环方式是使用内置函数。
在我们的例子中,我们可以用sum
函数代替for循环。该函数将计算数字范围内的值的总和。
上面的代码只需要0.84秒。这比我们之前使用的循环要快得多!这就是为什么我们应该选择内置函数而不是循环。
但是仍有改进的空间。
使用Numpy超快速循环
几周前,在我参加的数据科学课程中,我了解到我应该遵循的一种软件工程实践是优化我的代码。
我们可以通过矢量化操作来优化循环。这比其纯Python等效项(特别是在数值计算中)快一到两个数量级。
矢量化是我们可以通过NumPy获得的。Numpy是一个具有高效数据结构的库,旨在存储矩阵数据。它主要用C语言编写,因此速度是你可以依赖的。
让我们尝试使用Numpy方法.sum
和.arange
来代替Python函数。
这可以在0.22秒内完成任务。这比之前的方法要快得多。
这就是为什么每当可能时,你应该使用矢量运算而不是循环的原因。
使用更多计算来测试循环和Numpy
到目前为止,我们已经看到了Numpy的一个简单应用,但是如果我们不仅有一个for循环,还有一个if条件和更多的计算要做怎么办?
这就是Numpy明显优于循环的时候。
想象一下,我们有一个随机考试成绩的数组(从1到100),我们想得到不及格(分数<70)的人的平均分数。
下面是我们使用for循环的方法。
这大约需要15.7秒。不错,但是我们可以用Numpy获得更快的结果。
下面是我们使用Numpy的方法。
上面的代码只需要大约0.78秒。这快得多了,而且代码也很简单!
译自:https://towardsdatascience.com/a-super-fast-way-to-loop-in-python-6e58ba377a00
评论(0)