python中的Numpy二维数组遍历与二维数组切片后遍历效率比较
作者:大DDDDD 发布时间:2022-11-23 04:47:50
在python-numpy
使用中,可以用双层 for循环对数组元素进行访问,也可以切片成每一行后进行一维数组的遍历。
代码如下:
import numpy as np
import time
NUM = 160
a=np.random.random((NUM,NUM))
start = time.time()
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
end1 = time.time()
for ii in range(NUM):
b = a[ii,:]
for jj in range(NUM):
if b[jj] == 1.0:
pass
end2 = time.time()
print("end1",end1-start)
print("end2",end2-end1)
由于生成的是[0,1)中的数,因此两种操作会遍历所有的元素。多轮测试后,耗时如下:
当NUM为160时:
end1 0.006983518600463867
end2 0.003988742828369141
当NUM为1600时:
end1 0.71415114402771
end2 0.45178747177124023
结论:切片后遍历更快
原因:
楼主还暂不明确
一个想法:
b=a[ii,:]
在numpy中,为了提高效率,这种切片出来的子矩阵其实都是原矩阵的引用而已,所以改变子矩阵,原矩阵还是会变的
所以在内层循环中,第二种方法是在那一行元素所在的内存进行寻找。而第一种方法是先定位到行,再定位到列,所以比较慢?
大家是怎么想的呢?
关于numba
在小数据量下的速度慢于普通操作
什么是numba?
numba
实验比较:
import numpy as np
import time
NUM = 160
from numba import jit
a=np.random.random((NUM,NUM))
@jit(nopython=True)
def fun1(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
def fun2(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
@jit(nopython=True)
def fun3(a):
for ii in range(NUM):
b = a[ii,:]
for jj in range(NUM):
if b[jj] == 1.0:
pass
def fun4(a):
for iii in range(NUM):
b = a[iii,:]
for jjj in range(NUM):
if b[jjj] == 1.0:
pass
start = time.time()
fun1(a)
end1 = time.time()
fun2(a)
end2 = time.time()
fun3(a)
end3 = time.time()
fun4(a)
end4 = time.time()
print("end1",end1-start)
print("end2",end2-end1)
print("end3",end3-end2)
print("end4",end4-end3)
首先,当NUM为1600时,结果如下:
end1 0.2991981506347656 #无切片,有加速
end2 0.6372940540313721 #无切片,无加速
end3 0.08377814292907715 #有切片,有加速
end4 0.358079195022583 #有切片,无加速
其他条件相同的情况下,有切片的速度更快。同样,有numba加速的也比没加速的快。
但当NUM =160时,结果如下:
end1 0.29620814323425293 #无切片,有加速
end2 0.006980180740356445 #无切片,无加速
end3 0.08580684661865234 #有切片,有加速
end4 0.0029993057250976562 #有切片,无加速
有切片依旧比无切片的快。但是有numba加速的却比没有numba加速的慢。
原来@jit(nopython=True)只是对函数进行修饰,第一次调用会进行编译,编译成机器码,之后速度就会很快。
实验代码如下:
import numpy as np
import time
NUM = 160
from numba import jit
a=np.random.random((NUM,NUM))
@jit(nopython=True)
def fun1(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
def fun2(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
@jit(nopython=True)
def fun3(a):
for ii in range(NUM):
b = a[ii,:]
for jj in range(NUM):
if b[jj] == 1.0:
pass
def fun4(a):
for iii in range(NUM):
b = a[iii,:]
for jjj in range(NUM):
if b[jjj] == 1.0:
pass
for b in range(4):
start = time.time()
fun1(a)
end1 = time.time()
fun2(a)
end2 = time.time()
fun3(a)
end3 = time.time()
fun4(a)
end4 = time.time()
print("end1",end1-start)
print("end2",end2-end1)
print("end3",end3-end2)
print("end4",end4-end3)
print("---")
结果如下:
end1 0.29421305656433105
end2 0.0059833526611328125
end3 0.08181905746459961
end4 0.0029909610748291016
---
end1 0.0
end2 0.005949735641479492
end3 0.0
end4 0.004008769989013672
---
end1 0.0
end2 0.006977558135986328
end3 0.0
end4 0.00399017333984375
---
end1 0.0
end2 0.005974292755126953
end3 0.0
end4 0.003837108612060547
---
结论:
numba
加速时,第一次需要编译,需要耗时。之后调用就不需要了。
来源:https://blog.csdn.net/lllllllllljg/article/details/123105559


猜你喜欢
- 目录一、建立画布二、用plt.subplot函数建立坐标系,并分别绘制折线图和柱状图三、完整代码如下所示四、对应效果图如下所示一、建立画布i
- 说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位。而64位的exe文件在32位的win7操作系
- GetRef 函数 返回一个指向一过程的引用,此过程可绑定某事件。 Set object.eventname = GetRef(procna
- 前言这篇博客针对《PPython+Qt身体特征识别人数统计》编写代码,功能包括了相片,摄像头身体识别,数量统计。代码整洁,规则,易读。应用推
- 目录1.数据概览分析1.1 数据概览1.2 数据分析2. 项目总体思路2.1 数据读取2.2 模型预处理(1)数据离群点处理(2)数据归一化
- python中format函数用于字符串的格式化自python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快
- 自动更新统计信息的基本算法是: · 如果表格是在 tempdb 数据库表的基数是小于 6,自动更新到表的每个六个修改。 · 如果表的基数是大
- 一、Excel环境配置 服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即:1.Win9x+PWS+Office2.Wi
- 本文实例为大家分享了python实现日历效果的具体代码,供大家参考,具体内容如下一、代码编程过程1、根据年月日算出星期几def get_we
- 该 GIF 图来自于官网,文末有给出链接。描述依托于百度网盘巨大的的云存储空间,绝大数人会习惯性的将一些资料什么的存储到上面,但是有的私密链
- 可以的,看看下面的代码和说明:<%sessionID = session.SessionIDtimeout&nbs
- 一、最基础的应用import urllib2url = r'http://www.baidu.com'html = urll
- 1.ACCESS查询(query_info):select * from info where stu = name1 and age =
- %有哪几种含义?查找手册翻看《The Python Libary Reference》python库指南中附录index部分(P1899):
- 目标是想把在服务器上用pytorch训练好的模型转换为可以在移动端运行的tflite模型。最直接的思路是想把pytorch模型转换为tens
- 导语:举例:Python做一个根据后缀名整理文件的工具,先来看看效果:自动整理前:自动整理后:这样看起来就好很多了。1.准备开始之前,你要确
- 随着网页技术的发展,网络视觉设计与之前以程序员为主导的审美特征相比,具有了极大的改观。同时,随着美术、音乐、舞蹈人才的加入,网络开始在这一社
- 1、定义全局变'''全局变量: X 和 O 表示两方的棋子; EMPTY 表示棋位为空; TIE 表示平局; NUM
- 国外的空间和我们国内的空间使用的语言系统一般不一样,所以在网页程序上时如果处理不当很容易出现乱码,看了让人摸不着头脑。所以我们在编写程序时就
- 最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读