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 倍。

相关文章
|
4月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
本文介绍了Python中的循环语句,包括while和for循环的使用,range()函数的运用,以及continue、break和pass关键字的说明,同时提出了关于while循环是否能与成员运算符结合使用的思考。
55 1
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
|
4月前
|
Python
揭秘Python编程核心:一篇文章带你深入掌握for循环与while循环的奥秘!
【8月更文挑战第21天】Python中的循环结构——for循环与while循环,是编程的基础。for循环擅长遍历序列或集合中的元素,如列表或字符串;而while循环则在未知循环次数时特别有用,基于某个条件持续执行。本文通过实例展示两种循环的应用场景,比如用for循环计算数字平方和用while循环计算阶乘。此外,还通过案例分析比较了两者在处理用户输入任务时的不同优势,强调了根据实际需求选择合适循环的重要性。
55 0
|
25天前
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
21 2
|
28天前
|
Python
在 Python 中实现各种类型的循环判断
在 Python 中实现各种类型的循环判断
29 2
|
29天前
|
Python
Python 中,循环判断
Python 中,循环判断
48 1
|
1月前
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
32 4
|
2月前
|
Java 索引 Python
【10月更文挑战第19天】「Mac上学Python 30」基础篇11 - 高级循环技巧与应用
本篇将介绍更深入的循环应用与优化方法,重点放在高级技巧和场景实践。我们将讲解enumerate()与zip()的妙用、迭代器与生成器、并发循环以及性能优化技巧。这些内容将帮助您编写更高效、结构更合理的代码。
69 5
|
2月前
|
Python
Python 循环语句的高级应用与深度探索
本文深入探讨了Python中循环语句的高级应用,包括`for`循环遍历字典获取键值、同步遍历多个序列,以及`while`循环结合条件判断和异常处理。通过嵌套循环实现了矩阵乘法,并介绍了如何优化循环以提升程序性能。示例代码展示了这些技术的实际应用。
53 15
|
2月前
|
数据安全/隐私保护 Python
Python循环语句
【10月更文挑战第7天】
|
3月前
|
Python
Python 中如何循环某一特定列的所有行数据
Python 中如何循环某一特定列的所有行数据
35 2