加速你的Python代码:向量化技术揭秘

向量化代码实践与思考:如何借助向量化技术给代码提速 for (i = 0;但也有些例外,比如同一个向量的相邻数据执行操作,称为水平操作,例如指令__m128i _mm_hadd_epi16 (__m128i a, __m128i b),指令中的h代表horizontal,依次把a和b相邻的数据相加,如果a值为[1,2,3,4],b值为[5,6,7,8],那么结果为[1+2,3+4,5+6,7+8]。在一些老的编译器中,循环的次数需要是指令宽度的整数倍,例如128位指令,操作4字节的int类型,可以同时操作4个int类型,那么就要求循环次数是4的整数倍。 阅读详情

引言

在编程世界里,循环操作我们并不会感到陌生,几乎所有的编程语言都会教会我们如何使用它。因此,一旦遇到需要重复执行的任务,默认我们就会想到用循环来解决。但是,当任务规模扩大到百万或十亿级别的迭代时,坚持使用循环简直是自讨苦吃。你可能会浪费几个小时,最终才发现这条路行不通。这正是为什么在 Python 中采用向量化技术至关重要的原因。

Python 向量化技术不仅大幅提升了代码执行效率,还极大地增强了代码的可读性和简洁性。向量化技术让我们能够一次性处理整组数据,而不是逐个迭代,这在处理大规模数据集时尤为重要。从数据分析到机器学习模型的构建,向量化已经成为了提高性能的关键步骤。无论是在面对复杂算法还是日常编码实践中,向量化都显示出了其不可或缺的价值。通过优化和模块化设计,即使最初没有找到最优解,向量化也为后续性能提升提供了可能。这种技术不仅仅关乎速度,更关乎编程思维的转变——从传统逐步迭代到高效并行处理。随着技术的演进和应用场景的拓展,Python 向量化无疑将继续在数据科学领域扮演重要角色。

什么是向量化?

向量化(Vectorization)是一种执行数组操作的技术,它通过 NumPy 库加以实现。这个技术背后的原理是,它能够一次性对数组或序列中的所有元素进行操作处理,而不像‘for’循环那样逐行进行。

在不使用循环的情况下,向量化可以加快 Python 代码的速度。利用这样的方法可以有效地减少代码运行所需的时间。我们可以在 Python 中使用向量化来完成很多事情,例如缩放器乘法或点积乘法。

今天我们将探讨几个可以用向量化来替代 Python 循环的实例。这将帮助你在编程时节省宝贵时间,并提高编码技巧。

Example 1:求和运算

首先,让我们来看一个基础例子,在 Python 中如何使用循环和向量化来计算数字之和。

使用循环

import time 
start = time.time()

# 循环求和
total = 0
# 遍历150万数字
for item in range(0, 1500000):
    total = total + item

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

使用向量化

import numpy as np

start = time.time()
# 矢量化求和-使用numpy进行矢量化
# np. arange 创建从0到1499999的数字序列
print(np.sum(np.arange(1500000)))
end = time.time()
print(end - start)

##1124999250000
##0.007 Seconds

相比于使用 range 函数进行迭代,向量化的执行时间大约缩短了 18 倍。当处理 Pandas DataFrame 时,这种时间差异将更加明显。

Example 2:数学运算(应用于 DataFrame)

在数据科学领域,开发者处理 Pandas DataFrame 时经常用循环来创建新的派生列,并进行数学运算。

在下面的示例中,我们将展示如何轻松地用向量化技术替代循环来完成这类任务。

创建 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()
前 5 行数据快照标题

我们将新增一个名为 ‘ratio’ 的列,用来计算列 ‘d’ 和 ‘c’ 的比值。

使用循环

import time 
start = time.time()

# 使用iterrows遍历DataFrame
for idx, row in df.iterrows():
    # 创建新列 
    df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])  
end = time.time()
print(end - start)
### 105 Seconds

使用向量化

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

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

在 DataFrame 的操作中,我们可以看到显著的性能提升,使用向量化方法与传统 Python 循环相比,执行速度几乎快了 1000 倍。

Example 3:条件判断语句在数据框架上的运用

在编程时,我们经常会遇到需要使用条件判断 '如果-否则' 的场景。但在 Python 中,这些条件逻辑可以通过向量化操作来简化。

例如,在我们之前提到的第二个用例中创建的数据框架上,假设我们要根据列 ‘a’ 的条件来创建一个新的列 ‘e’。

使用循环

import time 
start = time.time()

# 使用iterrows遍历DataFrame
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)
### 耗时: 166 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.26007707237825133 sec

传统方法下我们会用循环来完成这个任务,而向量化方法则可以大幅提升执行速度——经测试,速度提升了惊人的600倍。

Example 4(进阶):解决机器学习与深度学习网络问题

深度学习任务通常涉及到大量复杂的方程求解,这些方程可能需要对数百万甚至数十亿条数据进行计算。使用 Python 的循环来计算这些方程通常效率极低,而向量化则是解决这一问题的理想选择。

举个例子,在多元线性回归分析中,我们需要为数百万条数据计算出 y 的值:

在这里,我们可以用向量化方法来替代传统的循环计算。

m1、m2、m3… 这些系数的值是通过解决上述方程,使用与 x1、x2、x3… 对应的数百万数据值计算得出的(为了简化问题,这里我们只讨论一个简单的乘法步骤)。

创建数据集

import numpy as np
# 设置m的初始值 
m = np.random.rand(1,5)

# 500万行的输入值
x = np.random.rand(5000000,5)

使用循环

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")
####计算时间 = 26.219 seconds

使用向量化

tic = time.process_time()

#点积
np.dot(x,m.T) 
toc = time.process_time()
print ("Computation time = " + str((toc - tic)) + "seconds")
####计算时间 = 0.102 seconds

传统方法下我们会使用循环,而向量化方法则可以使用 np.dot 函数来实现矩阵乘法,其速度比传统循环快了165倍。

总结

在 Python 编程中,向量化不仅速度极快,而且在处理大型数据集时更加高效。

随着时间的推移,开始尝试向量化你的代码,你会逐渐习惯这种思维方式,并从中受益。

References

[1]. Linear algebra|Vectors and spaces:

https://www.khanacademy.org/math/linear-algebra

[2]. Vectorization in Python

https://www.javatpoint.com/vectorization-in-python

性能-向量化如何加速你的 Python 代码 假设我们有一个包含数百万个数字的列表或数组,我们希望对它们进行一些数学运算。由于我们知道它们都是数字,并且如果我们要对所有数字执行相同的操作,我们可以“向量化”这个操作,即利用数据的同质性和操作的统一性。然而,这个定义仍然有些模糊。API 设计:向量化的 API 设计用于一次性处理同质数据数组,而不是通过for循环逐项处理。这与性能无关:理论上,你可能有一个快速的for循环,或者一个慢速的批处理 API。用快速语言实现的批处理操作:这是 Python 特有的含义,确实与性能有关。 阅读详情

相关推荐

性能-Pandas 向量化:更快的代码、更慢的代码、内存膨胀

在 Pandas 中,向量化并不一定意味着代码会运行得更快,它只是意味着 API 允许你批量操作,在这种情况下是对整个。有时,这意味着它也会更快,通过使用快速的原生代码运行整个循环——这是向量化的第二个含义,正如上面的数值计算所示。因此,在这种情况下,与数值计算不同,底层实现最终是相同的 Python 代码,只是添加了很多开销。然而,在实践中,某些情况下 Pandas 的向量化操作实际上可能会使代码变慢,或者至少不会更快。重要的是,在 Pandas 文档的上下文中,向量化仅保证第一个定义:能够对整个。

liluo0815481的博客 830

向量化是一切大模型技术的基础,大模型中的一切都是向量

向量化是一切大模型技术的基础,大模型中的一切都是向量。在之前的文章曾不止一次的讲过向量,向量作为大模型的基础数据格式,其重要性不言而喻;但大部分人对向量还是没有一个深刻的认识。所以,今天我们就来讨论一个问题,那就是向量化,大模型的入口。‍‍‍‍向量化向量的概念这里就不解释了,有问题的可以看之前的文章,或者自己去找一下向量,矩阵的内容看看。先来讨论第一个问题,为什么要向量化?‍‍‍‍‍‍‍原因在于计算机无法直接处理非数值性计算,所以的计算都需要转换成数值运算才行;

2401_84204207的博客 1531

Python向量化:深度学习中的性能加速利器

Python向量化是深度学习中提升性能的关键技术,通过用数组运算替代元素级循环,利用NumPy等库的底层优化实现10-100倍的加速效果。本文介绍了向量化的核心概念、性能优势和实践技巧,包括基础数学运算、矩阵操作、广播机制等核心内容,并通过性能对比实验展示了68倍的加速实例。文章还总结了深度学习中的典型应用场景和最佳实践,同时指出常见误区。掌握向量化技术不仅能提升代码效率,还能使代码更接近数学表达,降低维护难度,是深度学习工程师的必备技能。

zzh12345zz的博客 551

数据处理之向量化

向量化是一种将非数值型数据转换为数值型数据的技术,它在机器学习和深度学习领域广泛应用。

CherryXieのblog 3078

解锁AI黑科技:一文吃透向量化技术

向量化技术作为人工智能领域的核心支撑,在当下已深度渗透到众多产业,从电商推荐到智能客服,从图文跨模态对齐到多模态统一表示,其应用范围之广、影响力之大超乎想象。它不仅解决了传统数据处理中的诸多难题,还为各行业带来了前所未有的创新机遇。尽管目前向量化技术面临着数据稀疏性、高维向量计算效率、语义理解准确性等挑战,但通过降维技术、近似最近邻搜索算法、知识图谱融合等优化方案,这些问题正逐步得到有效解决。展望未来,向量化技术有望在量子计算、神经符号系统等前沿领域实现新的突破与融合,为人工智能迈向更高阶段奠定坚实基础。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1866

NumPy 加速揭秘:内存布局与向量化操作让它快如闪电

NumPy性能远超Python列表的关键在于优化的内存布局和向量化操作。其连续存储结构(C数组)提升内存效率,避免Python列表的指针开销。向量化计算利用底层C实现,一次处理多数据,大幅减少循环耗时。在高维数据处理中,NumPy原生支持矩阵运算,而Python需手动实现。实际测试显示,相同计算任务NumPy耗时仅为Python列表的1/10到1/100。建议数值计算优先选用NumPy,培养向量化思维,并与其他科学计算工具结合使用。随着发展,NumPy正整合GPU加速等新技术以应对更大规模数据挑战。

铭渊老黄 1671

Python 科学计算加速:从向量化思维到内存布局的深度调优

Python 科学计算的性能优化遵循一条清晰的路径:先向量化,再调布局,最后编译加速。具体落地步骤如下:第一,用 NumPy 广播与矩阵运算替代 Python 循环。这是投入产出比最高的优化手段,通常能获得 10-100 倍加速。第二,根据访问模式选择内存布局。行遍历用 C-order,列遍历用 F-order,避免跨步访问导致的缓存失效。第三,减少临时数组分配。使用out参数复用缓冲区,降低内存带宽压力。第四,对无法向量化的热路径使用 Numba JIT。先确认函数兼容nopython。

lady_mumu的博客 4158

从零开始掌握Python机器学习:七步教程 基础篇

前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...

hcgx2018的博客 1613

性能-Python 向量化作为性能技术的局限性

与 PyPy 一样,Numba 为该函数生成专门的机器代码,但与 PyPy 不同,它只能为 Python 语言的子集生成代码。不幸的是,PyPy 与 NumPy 的接口不太好;然而,向量化并不是解决所有问题的万能钥匙:有时它会以更高的内存使用为代价,有时你需要的操作不受支持,有时它根本不适用。此外,在编译语言中,编译器可能会找到优化我们第二种实现的方法,从而获得一系列单独的向量化操作无法实现的速度提升。由于它知道你有一个仅包含整数的列表,它可以为这种特定情况生成专门的、更快的机器代码。

liluo0815481的博客 657

关于基于Midas Civil API的二次开发——PyMiMi

现在写了第一条博客,希望是一个好的开始,能够每天抽出一两个小时或者更多的时间来写写代码,研究研究。我发现在我的工作中存在着大量的重复性工作,对于文档的开发是好办的,毕竟网上有现成库,只需要pip一下拿来用就好,但是对于Midas而言,在24版本之前官方都是没有一个可以使用的接口的,可能mct文件算半个?

ManiacsTraitor的博客 1850

OpenCLI入门:让任何网站变成你的命令行工具(超详细版)

最有用的工具,往往是最简单的。 opencli就是这样。 它不会帮你写代码,不会帮你做决策,但它能把200+个平台装进你的命令行。 让你用最简单的方式,获取最丰富的数据。

weixin_66295112的博客 2090

c++ 向量化_使用向量化、矩阵化、cuda等不同方法加速python程序

使用向量化、矩阵化、cuda等不同方法加速python程序第一次写知乎文章,本文中如有错误请不吝赐教,各位大大多多包涵。 本文是一次实验室组会的分享内容,对于机器视觉各类问题中经常需要处理大量计算任务的情况,以一个计算点云距离的例子来观察不同处理方法在python编程中对速度的影响。运行程序的电脑CPU型号:i9-9900X,GPU型号:RTX 2080 Ti ,python版本3.8.1 ,使用...

weixin_39580041的博客 778

群晖NAS断电后IP变了?3步搞定静态IP设置(附Linux挂载指南)

本文针对群晖NAS因断电重启导致IP地址变化的问题,提供了从根源到实践的完整解决方案。核心内容包括如何为NAS配置静态IP以彻底解决连接中断,并详细讲解了在Linux系统中通过NFS协议稳定挂载NAS共享文件夹的步骤与指南,确保网络存储服务持久可靠。

weixin_29271263的博客 851

向量化代码

作者|Andy Reagan 编译|VK 来源|Towards Datas Science 在MATLAB和数值计算的世界,for循环被剪掉,而向量为王。 在我的博士学位期间,Lakoba教授的数值分析课是我参加的最具挑战性的课程之一,在课程之后,我对向量代码有了深刻的理解。 我最喜欢的向量化例子是,一位同事在写了一篇非常酷的论文,对其中所涉及的大量计算做了脚注,与我分享了他的lorenz96代码。其中,内部的向量化速度比没有向量化快了4倍。 现在,快速向量代码使机器学习成为可能。例如QR分解,虽然我还没做

TensorFlowNews 1210

PaddleOCR实战:从零开始训练自己的OCR模型(附完整代码与数据集处理技巧)

本文提供了一份详尽的PaddleOCR实战指南,手把手教你从零开始训练专属的OCR模型。内容涵盖高质量训练数据的准备与标注技巧、预训练模型的选型对比、关键参数调优策略,并附有完整的代码示例。通过遵循本文的步骤,开发者可以高效构建并优化贴合自身业务场景的高精度OCR模型,实现从数据到部署的全流程掌握。

weixin_29263201的博客 570

FTViewSE利用VB脚本制作简易日报表

罗克韦尔SE用VB做的简单的报表

z0800656的博客 3023

python for循环加速_干货总结,24招加速你的Python代码,值得收藏

一,分析代码运行时间第1式,测算代码运行时间平凡方法快捷方法(jupyter环境)第2式,测算代码多次运行平均时间平凡方法快捷方法(jupyter环境)第3式,按调用函数分析代码运行时间平凡方法快捷方法(jupyter环境)第4式,按行分析代码运行时间平凡方法快捷方法(jupyter环境)二,加速你的查找第5式,用set而非list进行查找低速方法高速方法第6式,用dict而非两个list进行匹配...

weixin_34585343的博客 1494

DBeaver连接IoTDB避坑指南:手动配置JDBC驱动的完整流程(附问题排查)

本文提供了在DBeaver中手动配置Apache IoTDB JDBC驱动的完整流程与避坑指南。详细解析了从驱动创建、库文件添加(关键是指向整个lib目录)到连接测试的每一步,并重点针对常见的ClassNotFoundException、连接拒绝等错误提供了深度排查方案,帮助用户高效建立图形化管理连接。

weixin_28327051的博客 395

24招加速你的Python,超级实用

从以下九个方面讨论了加速Python的具体方法,一共24个,每个都带有优化前后的对比,非常实用。我在此基础上 主要美化了编辑 ,方便读者更容易阅读学习。

m0_58477260的博客 2717

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

天天酷科研的博客 506

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

1.3 Python与向量化

文章目录1.3.1 向量化(Vectorization)1.3.2 更多向量化的例子(More Vectorization Examples)1.3.3向量化logistic回归(Vectorizing Logistic Regression)1.3.4 向量化logistic回归的梯度输出(Vectorizing Logistic Regression’s Gradient Output)1.3.5 Python中的广播(Broadcasting in Python)1.3.6 关于python/nump

bandiaoz的博客 2340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

高频回测性能瓶颈突破:Python多进程+向量化加速实战技巧揭秘

突破python量化回测性能瓶颈,详解高频场景下多进程与向量化加速实战技巧。适用于大规模策略回测,显著提升计算效率。结合NumPy与multiprocessing优化执行速度,降低耗时。值得收藏的高效回测方案,点击了解实现细节。

Instrustar的博客 1039

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Scalene AI 优化实战:DataFrame 列筛选从 17 倍加速看向量化改造

本篇技术指南以 Scalene 仓库中 `test/automatic/dataframe` 的优化示例为主体,完整剖析一个真实的数据分析性能问题:在 1 万列 × 双层 MultiIndex 的 DataFrame 上做逐列条件筛选,原始 Python 循环写法与向量化写法性能相差近 17 倍。读完本文,你将掌握该示例的数据构造、代码逐行对比、向量化改写思路,以及 Scalene 的 AI 优化

gitblog_00952的博客 797

python向量化编程技巧_python学习随笔-向量化

本文只是在学习过程中框架的简记和遇到问题的整理,必然不全面和存在错漏向量化是python的一种魔法加速操作,可以在一定程度上加速python运算,主要依托numpy库和数组的运算。目前看到的原理解释有两种,一种是numpy库的底层是cpp的,所以比较快,一种是向量化会使python并行运算的程度加快。这两种在某种程度上可能是相关的。我接触向量化的动机是python作业要用线性变换的方法逐像素旋转图...

weixin_39573822的博客 1303

如何通过SIMD向量化技术极致优化算法性能:终极加速指南

在数据结构与算法的实现中,性能优化始终是开发者追求的核心目标。GitHub加速计划(alg/algo)项目提供了50个必知必会的代码实现,涵盖从数组、链表到排序、搜索等基础算法模块。本文将深入探讨如何利用SIMD(单指令多数据)向量化技术,为这些算法带来数量级的性能提升,帮助开发者打造更快、更高效的应用程序。 ## 一、SIMD技术:现代CPU的隐藏性能宝藏 🚀 SIMD是一种并行处理技术,

gitblog_00039的博客 1077
上一篇: [译] 2023: AI 的一年
下一篇: 2023检索增强生成技术(RAG)研究进展
技术狂潮AI
博客等级 码龄3年 1282粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值