脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 说再见Python循环,“向量化”让我们代码更高效

说再见Python循环,“向量化”让我们代码更高效

2024-02-28 17:03小白玩转Python Python

在这篇文章中中,我们可以轻松地用向量化替代Python循环。这将帮助我们节省时间,并在编码方面变得更加熟练。

介绍

循环在我们身边自然而然地出现,我们几乎在所有编程语言中都学过循环。因此,默认情况下,每当有重复操作时,我们就开始实现循环。但是当我们处理大量迭代(数百万/数十亿行)时,使用循环就是一种罪行。我们可能会卡住好几个小时,最后意识到它行不通。这就是在Python中实现向量化变得非常关键的地方。

说再见Python循环,“向量化”让我们代码更高效

什么是向量化?

向量化是在数据集上实现(NumPy)数组操作的技术。在后台,它将操作应用于数组或系列的所有元素,一次性完成(不像“for”循环一次操作一行)。在这篇文章中中,我们可以轻松地用向量化替代Python循环。这将帮助我们节省时间,并在编码方面变得更加熟练。

用例1:找到数字的和

首先,我们将看一个使用循环和Python中的向量化找到数字和的基本示例。

使用循环 :

import time 
start = time.time()

# iterative sum
total = 0
# iterating through 1.5 Million numbers
for item in range(0, 1500000):
    total = total + item

print('sum is:' + str(total))
end = time.time()
print(end - start)
#1124999250000
#0.14 Seconds

使用向量化:

import numpy as np

start = time.time()
# vectorized sum - using numpy for vectorization
# np.arange create the sequence of numbers from 0 to 1499999
print(np.sum(np.arange(1500000)))
end = time.time()
print(end - start)

##1124999250000
##0.008 Seconds

相比于使用range函数进行迭代,向量化执行时间约为循环的18倍。在使用Pandas DataFrame时,这种差异将变得更为显著。

用例2:数学运算(在DataFrame上)

在数据科学中,开发人员在使用Pandas DataFrame时,使用循环进行数学运算以创建新的派生列。在以下示例中,我们可以看到如何轻松地将循环替换为这种情况下的向量化。

创建DataFrame:

DataFrame是以行和列形式的表格数据。我们创建一个具有500万行和4列,填充了0到50之间的随机值的Pandas DataFrame。

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 50, size=(5000000, 4)), columns=('a','b','c','d'))
df.shape
# (5000000, 5)
df.head()

说再见Python循环,“向量化”让我们代码更高效

前5行

我们将创建一个新列'ratio',以找到列'd'和'c'的比率。

使用循环:

import time 
start = time.time()

# Iterating through DataFrame using iterrows
for idx, row in df.iterrows():
    # creating a new column 
    df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])  
end = time.time()
print(end - start)
### 109 Seconds

使用向量化:

start = time.time()
df["ratio"] = 100 * (df["d"] / df["c"])

end = time.time()
print(end - start)
### 0.12 seconds

我们可以看到,在DataFrame中,与Python中的循环相比,向量化操作所需的时间几乎快1000倍。

用例3:if-else语句(在DataFrame上)

我们实现了许多需要使用“If-else”类型逻辑的操作。我们可以轻松地用Python中的向量化操作替换这些逻辑。让我们看下面的例子以更好地理解它(我们将使用在用例2中创建的DataFrame):

假设我们想基于对现有列‘a’的某些条件创建一个新列‘e’。

使用循环:

import time 
start = time.time()

# Iterating through DataFrame using iterrows
for idx, row in df.iterrows():
    if row.a == 0:
        df.at[idx,'e'] = row.d    
    elif (row.a <= 25) & (row.a > 0):
        df.at[idx,'e'] = (row.b)-(row.c)    
    else:
        df.at[idx,'e'] = row.b + row.c
end = time.time()
print(end - start)
### Time taken: 177 seconds

使用向量化:

# using vectorization 

start = time.time()
df['e'] = df['b'] + df['c']
df.loc[df['a'] <= 25, 'e'] = df['b'] -df['c']
df.loc[df['a']==0, 'e'] = df['d']end = time.time()
print(end - start)
## 0.28007707595825195 sec

向量化操作所需的时间比带有if-else语句的Python循环快600倍。

用例4(高级):解决机器学习/深度学习网络

深度学习要求我们解决多个复杂的方程,而且还要为数百万甚至数十亿行运行。在Python中运行循环来解决这些方程非常慢,而向量化是最优解。例如,为了计算多元线性回归方程中数百万行的y值:

说再见Python循环,“向量化”让我们代码更高效

多元线性回归

我们可以用向量化替换循环。m1,m2,m3...的值是通过使用与x1,x2,x3...相对应的数百万个值解上述方程得出的(为简单起见,我们只看一个简单的乘法步骤)

创建数据:

import numpy as np
# setting initial values of m 
m = np.random.rand(1,5)

# input values for 5 million rows
x = np.random.rand(5000000,5)

说再见Python循环,“向量化”让我们代码更高效

m的输出

说再见Python循环,“向量化”让我们代码更高效

x的输出

使用循环:

import numpy as np
m = np.random.rand(1,5)
x = np.random.rand(5000000,5)

total = 0
tic = time.process_time()
for i in range(0,5000000):
    total = 0
    for j in range(0,5):
        total = total + x[i][j]*m[0][j] 
        
    zer[i] = total 
toc = time.process_time()
print ("Computation time = " + str((toc - tic)) + "seconds")
####Computation time = 28.228 seconds

使用向量化:

说再见Python循环,“向量化”让我们代码更高效

两个矩阵的点积

tic = time.process_time()

#dot product 
np.dot(x,m.T) 
toc = time.process_time()
print ("Computation time = " + str((toc - tic)) + "seconds")
####Computation time = 0.107 seconds

np.dot在后台实现了向量化矩阵乘法。与Python中的循环相比,它快165倍。

结论

在Python中,向量化非常快,应该优先使用,特别是在处理非常大的数据集时。

随着时间的推移开始实施它,我们将逐渐习惯以向量化代码的方式思考。

原文地址:https://mp.weixin.qq.com/s?__biz=Mzk0OTExMjc2Nw==&mid=2247494086&idx=1&sn=7592ee7c7c2ec70c94a45e770c4d5a29

延伸 · 阅读

精彩推荐
  • PythonPandas-DataFrame知识点汇总

    Pandas-DataFrame知识点汇总

    这篇文章主要介绍了Pandas-DataFrame知识点汇总,DataFrame是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值,下面我们一起进入文章了解更多...

    文哥的学习日记4372022-11-03
  • Python解决Python获取字典dict中不存在的值时出错问题

    解决Python获取字典dict中不存在的值时出错问题

    今天小编就为大家分享一篇解决Python获取字典dict中不存在的值时出错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    qijingpei6262021-04-09
  • Python如何动态生成 Jekyll 配置文件

    如何动态生成 Jekyll 配置文件

    使用 Python 或 Bash 将动态数据插入 Jekyll 静态网站中,并且避免创建一个 API 后端。...

    Linux中国9682021-11-08
  • PythonPython实现简单多线程任务队列

    Python实现简单多线程任务队列

    本文给大家介绍的是使用很简单的代码实现的多线程任务队列,给大家一个思路,希望对大家学习python能够有所帮助...

    Python教程网8782020-08-13
  • PythonPython中fnmatch模块的使用详情

    Python中fnmatch模块的使用详情

    这篇文章主要介绍了Python中fnmatch模块的使用详情,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    廖高祥5352021-04-23
  • PythonPython学习之名字,作用域,名字空间(下)

    Python学习之名字,作用域,名字空间(下)

    这篇文章主要介绍了Python学习之名字,作用域,名字空间,紧接上一篇文章内容展开全文,需要的小伙伴可以参考一下,希望对你的学习有所帮助...

    编程学习网3932022-12-27
  • Python使用pyinstaller打包.exe文件的详细教程

    使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstal...

    hacker70711472022-12-06
  • Pythonpython常用数据结构集合详解

    python常用数据结构集合详解

    这篇文章主要介绍了python常用数据结构集合详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下,希望对你的学...

    小han的日常7962022-08-26