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
猜你喜欢
- Web 设计离不开调色板,现成的调色板多不胜数,不管是 Windows 标准色板,还是 Web 标准色板,还是 Pantone 色板,它们虽
- CAPTCHA,全称为“Completely Automated Public Turing test to tell Computers
- 源码及注释:import pygamefrom sys import exitfrom random import randintimpor
- 前言在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的
- 本文实例讲述了Python打印斐波拉契数列的方法。分享给大家供大家参考。具体实现方法如下:#打印斐波拉契数列#!/usr/bin/pytho
- 可以查看: 代码如下:OPEN SYMMETRIC KEY 命令关于 对称密钥加密使用证书解密 CREATE MASTER KEY ENC
- CSS3草案中定义了{opacity:来声明元素的透明度,这已经得到了大多数现代浏览器的支持,而IE则很早通过特定的私有属性filter来实
- 1 、据说python3就没有这个问题了2 、u'字符串' 代表是unicode格式的数据,路径最好写成这个格式,别直接跟字
- 一、CAN报文简介CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称
- 一、适配器模式适配器,顾名思义是一种万能的接口,达到万能转换的效果。适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口
- 前段时间和哥们胡侃的时候还说腾讯抄的有水平,不过这次我溴了,腾讯房产被新浪乐居给幽默了一把。乐居:http://bj.house.sina.
- 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的 SELECT语句,另外一种就是更新语句,也叫做数据操作语句。言外之 意
- 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表.这时候就可以使用list.sort方法和内置函数
- 测试方法首先使用implode, serialize, json_encode, msgpack_pack创建四个文本文件,用于测试。创建代
- 其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。下面的代码放在一个名为UploadFile.class.php文件内
- python使用utf8编码,mysql也是utf8编码,是什么问题?后来查了一下,使用一个简单的办法即可:vsql = "ins
- 使用本文给出的方法就可以制作出一个简单的rss阅读器了。用xmldom方法打开xml文件,如果是本地的没有问题,就是用Server.MapP
- 这篇文章主要介绍了Python读取csv文件实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 数据库查询优化的实用技巧:本文中,abigale代表查询字符串,ada代表数据表名,alice代表字段名。技巧一:问题类型:ACCESS数据
- 如下所示:3σ 原则(u-3*σ ,u+3*σ )离差标准化(x-min)/(max-min)标准差标准化(x-u)/σ小数定标标准化x/1