python小练习:涉及print,json,numpy
枚举参考文件夹中的文件,并与待比较文件件中的同名文件比较是否一致。
#! /usr/bin/python3.6
# -*- coding:utf-8 -*-
import os
import sys
import json
import numpy as np
from sqlalchemy import false
def cmp_file(ref_file: str, dst_file: str) -> bool:
ref_base_name = os.path.basename(ref_file)
dst_base_name = os.path.basename(dst_file)
assert os.path.exists(ref_file), f"ref file not exist: {ref_base_name}"
if not os.path.exists(dst_file):
print(f'dst file not exist: {dst_base_name}')
return false
ref_data = np.fromfile(ref_file, dtype=np.ubyte, count=-1)
dst_data = np.fromfile(dst_file, dtype=np.ubyte, count=-1)
is_equal = np.array_equal(ref_data, dst_data)
print(is_equal, ": ", ref_base_name)
return is_equal
def cmp_dir(ref_dir: str, dst_dir: str) -> None:
print(f'\n==========>>> Start compare {ref_dir} and {dst_dir}')
ref_names = os.listdir(ref_dir)
for name in ref_names:
ref_file = os.path.join(ref_dir, name)
dst_file = os.path.join(dst_dir, name)
cmp_file(ref_file, dst_file)
def main():
if len(sys.argv) < 2:
print('usage: dump_dir_cmp.py dir_config.json')
return
json_file = sys.argv[1]
with open(json_file) as fp:
js_data = json.load(fp)
for dst_dir in js_data['dst_dirs']:
cmp_dir(js_data['ref_dir'], dst_dir)
if (__name__ == '__main__'):
main()
配置样例:
{
"ref_dir": "./dump_data/NPU_DUMPF001_P0/tensorflow_squeezenet_task0_loop0",
"dst_dirs": [
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task0_loop0",
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task1_loop0",
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task2_loop0",
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task3_loop0",
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task4_loop0",
"./dump_data/NPU_DUMPF002_P0/tensorflow_squeezenet_task5_loop0"
]
}
样例2(re匹配):
#! /usr/bin/python3.6
# -*- coding:utf-8 -*-
# cmp_dump_pickle_dir.py
import os
import re
import sys
import numpy as np
from numpy.linalg import norm
import pickle
import shutil
from sklearn.metrics.pairwise import cosine_similarity
def vec_similarity(v1: np.array, v2: np.array):
sim = cosine_similarity(v1.reshape(1, v1.size), v2.reshape(1, v2.size))
return sim[0][0]
# norm2 = norm(v1) * norm(v2)
# cosine = np.dot(v1,v2) / norm2
# return cosine
def re_find_file(dir: str, op_name: str) -> str:
for fname in os.listdir(dir): # 分组匹配: (...|...)
re_dst = re.search(f"{op_name}_(out_[\S]*|out\d).bin$", fname)
if re_dst is not None:
return re_dst.group()
return None
def cmp_file(ref_file: str, dst_file: str, dtype: str) -> bool:
ref_base_name = os.path.basename(ref_file)
dst_base_name = os.path.basename(dst_file)
assert os.path.exists(ref_file), f"ref file not exist: {ref_base_name}"
assert os.path.exists(dst_file), f"dst file not exist: {dst_base_name}"
ref_data = np.fromfile(ref_file, dtype=dtype, count=-1)
dst_data = np.fromfile(dst_file, dtype=dtype, count=-1)
if dtype == 'float32' or dtype == 'float16':
sim = vec_similarity(ref_data, dst_data)
print(sim > 0.95, f", simularity={sim} : ", ref_base_name)
return (sim > 0.95)
is_equal = np.array_equal(ref_data, dst_data)
print(is_equal, ": ", ref_base_name)
return is_equal
def cmp_dir(ref_dir: str, dst_dir: str) -> None:
print(f'\n==========>>> Start compare {ref_dir} and {dst_dir}')
patten = re.compile(r"_op_out_[\S]*.bin$")
ref_names = os.listdir(ref_dir)
not_exist_ops = []
for ref_name in ref_names:
assert re.match(r"[\S]*_op_out_[\S]*.bin$", ref_name) is not None, f"bad file name: {ref_name}"
dtype = ref_name[ref_name.rfind('_') + 1:ref_name.rfind('.')]
mdl_name = ref_name[0:patten.search(ref_name).span()[0]]
dst_name = re_find_file(dst_dir, mdl_name)
if dst_name is None:
not_exist_ops.append(mdl_name)
continue
ref_file = os.path.join(ref_dir, ref_name)
dst_file = os.path.join(dst_dir, dst_name)
cmp_file(ref_file, dst_file, dtype=dtype)
print(f'\nNot exist ops: {not_exist_ops}')
def dump_pickle_file(pickle_file: str, out_bin_dir: str, force_dtype_u8: bool) -> None:
def is_float_type(data_buff: np.ndarray) -> bool:
return data_buff.dtype == np.float16 or data_buff.dtype == np.float32
with open(pickle_file, "rb") as f:
op_ref = pickle.load(f)
for i, (key, value) in enumerate(op_ref.items()):
data_buff = value.flatten()
# print("layer: ", key, " shape: ", value.shape, " type: ", value.dtype, " size: ", value.size)
dtype = 'uint8' if force_dtype_u8 and is_float_type(data_buff) else data_buff.dtype
print("pickle key: %30s, size: %7d, dtype: %s" % (key, value.itemsize * value.size, data_buff.dtype))
data_buff.tofile(os.path.join(out_bin_dir, key.replace("/", "_") + f"_op_out_{dtype}.bin"))
#print("op ref: type ", type(op_ref), op_ref.size)
#print("op shape: type ", op_ref['data'].shape)
def mkdir(dir: str) -> None:
if os.path.exists(dir):
shutil.rmtree(dir)
os.mkdir(dir)
def main():
assert len(sys.argv) >= 4, 'usage: dump_dir_cmp.py pickle_file pickle_out_dir dst_dump_dir [force_dtype_u8]'
force_dtype_u8 = True if len(sys.argv) >= 5 and sys.argv[4] == 'force_dtype_u8' else False
#np.seterr('raise')
mkdir(sys.argv[2])
dump_pickle_file(sys.argv[1], sys.argv[2], force_dtype_u8)
cmp_dir(sys.argv[2], sys.argv[3])
if (__name__ == '__main__'):
main()
python小练习:涉及print,json,numpy的更多相关文章
- Python之数据序列化(json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...
- 让你瞬间萌比的35个python小技巧
今天在看python算法的时候,看到一篇关于python的小技巧.瞬间萌比了,原来python也可以这样玩,太神奇了.萌比的是原来这么简单的东西自己都不知道,虽然会写.废话不多说了,开始上菜. 1.拆 ...
- 5个常常被大家忽略的Python小技巧
下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助. 1. 字典推导(Dictionary comprehensions)和集合推导(Set comprehensi ...
- Python 小程序,对文件操作及其它
以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...
- 小学生都能学会的python(小数据池)
小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...
- Python 小案例实战 —— 简易银行存取款查询系统
Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...
- 这42个Python小例子,太走心
告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 < ...
- Python学习day18-常用模块之NumPy
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- MariaDB数据库 主-从 部署
〇.前言 好久没碰数据库了 准备环境: centos7自带的MariaDB,没有的话下面是安装命令 yum install -y mariadb mariadb-server systemctl re ...
- 对表白墙js文件的解释
index.js 1 Page({ 2 3 /** 4 * 页面的初始数据 5 */ 6 data: { 7 xcx_appid:"", 8 }, 9 HuoquDaohangLi ...
- Kubernetes 多租户:多租户介绍
多租户集群由多个用户和/或工作负载共享,这些用户和/或工作负载被称为"租户".多租户集群的运营方必须将租户彼此隔离,以最大限度地减少被盗用的租户或恶意租户可能对集群和其他租户造成的 ...
- Compose 命令说明
命令对象与格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器.如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响. 执行 ...
- Windows上Navicat工具远程连接PostgreSQL数据库
首先,在pgdata(也就是在安装pg时指定的存放数据的文件见中)文件夹中,找到pg_hba.conf文件,在文件最后写入下面的内容: host all all 0.0.0.0/0 trust 接着, ...
- C#-5 类和继承
一 类继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.继承呈现了面向对象程序设计的层次结构. 通过继承,我们能以一个已经存在的类为基础来定义一个新类.已存在的类称为基类或父类 ...
- vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇
在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...
- SQL语句——为什么分组函数(多行处理函数)不能用在where语句之后?
在SQL语句中,常见的分组查询函数为: sum()求和 avg()求平均值 min()求最小值 max()求最大值 count()求数目 在分组函数中有几个重要的特征: 1.分组函数进行时自动忽略nu ...
- 在PE文件中简单注入代码,实现在启动前弹窗
获得的新知识: 1.kernel32.dll,user32.dll,ntdll.dll等一些dll在同一个PC环境下的映射到虚拟内存基址是一样的. 2.在win8以上系统上,更改PE文件的入口点要大于 ...
- 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)
有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 3 ...