python 使用矢量化替换循环

简介: python 使用矢量化替换循环

介绍


🎵🕺🗣🏀


循环自然而然地出现在我们身边,我们了解几乎所有编程语言中的循环。因此,默认情况下,只要有重复操作,我们就会开始执行循环。但是当我们处理大量迭代(数百万/十亿行)时,使用循环是一种犯罪。您可能会被困几个小时,后来才意识到它行不通。这就是在 python 中实现矢量化变得非常关键的地方。


什么是矢量化?


矢量化是在数据集上实现 (NumPy) 数组操作的技术。在后台,它将一次性运算数组中所有元素(不同于一次操作一行的“for”循环)。

下面我将用一些示例,分别使用python 循环和矢量化实现,看下能够帮助您节省出多少时间。

就是把能数学运算的数据(int、float)放到numpy的数组中处理


示例

示例1:求数字之和

循环


import time 
start = time.time()
total = 0
for item in range(0, 1500000):
    total = total + item
print('sum is:' + str(total))
end = time.time()
print(end - start)
#sum is 1124999250000
#0.14 Seconds


矢量化


import numpy as np
start = time.time()
print(np.sum(np.arange(1500000)))
end = time.time()
print(end - start)
#1124999250000
#0.008 Seconds


与使用循环函数的迭代相比,矢量化的执行时间减少了约 18 倍。在使用 Pandas DataFrame 时,这种差异将变得更加显着。


示例2:在DataFrame上数学运算


DataFrame 是行和列形式的表格数据。

创建一个具有 500 万行和 4 列的 pandas DataFrame,其中填充了 0 到 50 之间的随机值。


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()


目的创建一个新列“ratio”来保存列“d”和“c”的比率。

循环


import time 
start = time.time()
for idx, row in df.iterrows():
    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:在 DataFrame 上If-else语句


基于示例2,我们根据现有列“a”上的某些条件创建一个新列“e”。

循环


import time 
start = time.time()
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)
#177 seconds


矢量化


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 值:


b7f158fe42cf6ba953ccdb6cff33776f.jpg

循环


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(str((toc - tic)) + "seconds")
# 28.228 seconds


矢量化


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


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

相关文章
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
259 1
|
4月前
|
Python
Python中的循环可以嵌套使用吗?
Python中的循环可以嵌套使用吗?
336 57
|
6月前
|
机器学习/深度学习 算法 关系型数据库
Python循环进阶:嵌套与控制的深度解析
本文深入探讨Python中嵌套循环的原理与应用,从数学模型到工程实践全面解析。内容涵盖嵌套循环的本质(如笛卡尔积实现、变量作用域)、精细控制技巧(如break/continue、迭代器协议、异常处理),以及性能优化策略(预计算、向量化等)。同时结合树形结构遍历、动态规划、游戏开发等典型场景,提供最佳实践建议。掌握这些技巧,助你突破编程瓶颈,实现复杂问题的优雅解决。
237 6
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
本文介绍了Python中的循环语句,包括while和for循环的使用,range()函数的运用,以及continue、break和pass关键字的说明,同时提出了关于while循环是否能与成员运算符结合使用的思考。
204 1
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
|
7月前
|
存储 Shell 开发者
Python用户输入与While循环
本文介绍了Python中用户输入与while循环的结合使用,通过`input()`函数获取用户输入,并利用while循环实现重复操作,如创建交互式程序或用户驱动的循环。示例代码展示了如何让用户输入数字并计算总和,直到输入指定退出命令。这种组合能帮助开发者构建强大的交互式Python应用。
227 1
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
153 2
|
Python
在 Python 中实现各种类型的循环判断
在 Python 中实现各种类型的循环判断
258 2
|
Python
Python 中,循环判断
Python 中,循环判断
266 1
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
138 5
|
Java 索引 Python
【10月更文挑战第19天】「Mac上学Python 30」基础篇11 - 高级循环技巧与应用
本篇将介绍更深入的循环应用与优化方法,重点放在高级技巧和场景实践。我们将讲解enumerate()与zip()的妙用、迭代器与生成器、并发循环以及性能优化技巧。这些内容将帮助您编写更高效、结构更合理的代码。
157 5

推荐镜像

更多