NumpyConcatenate加速

NumpyConcatenate加速

多次循环进行 Numpy Concentrate 操作后,当原始数组变得过大的时,单步处理时间会逐渐变长,处理大量数据的时候时间成本极高。

解决思路

这里简单的讲一下问题的定位过程,通过装饰器 Check 每个函数的执行时间,重点关注执行时长逐渐变长的部分。

1
2
3
4
5
6
7
8
9
10
11
from time import time

def timer(func):
def func_wrapper(*args, **kwargs):
time_start = time()
result = func(*args, **kwargs)
time_end = time()
res = time_end - time_start
print("{} cost time: {} s".format(func.__name__, res))
return result
return func_wrapper

就会发现当 np.Concatenate 导致 Array 很大之后,运行就会逐渐减缓。由于运行缓慢是由于对大数组操作导致的,因此这里考虑将大数组切分成多个小数组,然后再最后进行合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with open(file, 'r') as rf:
for line in rf:
...
new_row_array = ...
key = ...
if len(res_list[key][-1]) == 0 :
res_list[key][-1] = new_row_array
else:
if len(res_list[key][-1]) >= MAX_LENGTH:
res_list[key].append(new_row_array)
else:
res_list[key][-1] = np.concatenate([
res_list[key][-1], new_row_array
])
for i in range(len(res_list)):
res_list[i] = np.concatenate(res_list[i], axis=0)

可以看上述这段代码,通过对-1 的使用,来自动的切分 Array,最后再整体合并,这样就能避免每个数组过大的问题。

本地实验测试也成功,将原本耗时 400s 的处理过程减少到了 30s

Fi


Python00 Conda 与 Pip

Python00 Conda 与 Pip

@Aikenhong 的旧笔记翻新完善 1.0

Python 的灵活和广泛应用场景来自于众多的第三方库,由于强大的可拓展性和众多的库,使得 Python 的使用简单灵活,且应用面极广。

但是不同库之间的相互依赖关系,对版本的不同要求等等因素,使得”环境配置”成为了开发者闻之变色的一词,对一个新的库和项目环境的配置尝尝会花去大量的时间,这可能也是 Docker、Venv(虚拟环境)必须存在的原因之一。

这里不对 Docker 及其相关技术,进行说明,会另开章节进行学习。

才疏学浅的本菜鸡希望从 python 开发者避不开的 conda 和 pip 出发介绍一下关于库安装的一些事情,以及这两个 CLI 的关系。


Python Unittest 单元测试的编写与执行

Python Unittest 单元测试的编写与执行

该文章将介绍 Python 中的单元测试之 Unittest 模块,及其在 VsCode 中的集成和使用,主要参考的链接有以下的三个:

  1. Unittest的基本用法Python官方文档
  2. VsCode运行Unittest,其对应 VsCode 侧边栏中的“测试”模块,该部分就由本文来自行补充
  3. 使用Unittest模拟input的输入,便于测试基于命令行输入的代码

python 与标记语言的交互

python 与标记语言的交互

对于各种形式的标记文档(markup)和数据集的处理进行一个整合,还有一些python中的相关模块(比比如glob,后续可能会迁移到别的文档中),主要包括:yaml,json,csv,xml,这些可拓展的标记语言.

TODO:

  • [ ] csv,xml:这一部分可以看一下吉仲师兄那边是怎么存和取文件的,继承一下代码减少我这一部分的工作量
  • [ ] 按照csv文件对数据集进行本地的文件夹切分。实际上很多数据集,像mini-imageNet这类的是需要我们下载下来之后按照csv文件对训练集和测试集进行切分的
  • [ ] 使用sklearn对完整的未切分数据进行切分。

Python: Glob

文件操作相关模块,用于简单的路径匹配的模块,用来查找路径中的相关文件,基本的正则匹配规则如下:

“*”: 匹配0哥或多个字符

“?” : 匹配单个字符

“[ ]”: 匹配指定范围内的字符,如[0-9]匹配所有的数字

glob.glob:

返回所有匹配的路径列表,只有一个参数pathname,定一乐文件路径的匹配规则,可以是绝对路径或者是相对路径,具体的使用可以参考如下的方式:

1
2
3
4
5
6
7
8
9
10
11
12
for xmlpath in glob.glob('media/all/DATAPART/' + "*")
# xmlpath 遍历文件夹下的所有文件和文件夹

for xmlpath in glob.glob(xmlpath + "/*/*")
# xmlpath 遍历文件夹下所有文件夹中的文件夹中的文件:按照层数自由设定

img_path = sorted(glob.glob(os.path.join(images, '*.npy')))
# 遍历文件夹下的所有npy文件,说实话感觉这个怪离谱的,晚点试一下

import glob
print(glob.glob(r"E:/imgdir/*/*.jpg"))


(转)What the Fuck Python! 一些python特性

(转)What the Fuck Python! 一些python特性

What the f*ck Python! 🐍

一些有趣且鲜为人知的 Python 特性.

English | 中文


WTFPL 2.0 Commit id 996.icu

Python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的功能特性. 但有的时候, Python 的一些输出结果对于初学者来说似乎并不是那么一目了然.

这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性, 并尝试讨论这些现象背后真正的原理!

虽然下面的有些例子并不一定会让你觉得 WTFs, 但它们依然有可能会告诉你一些你所不知道的 Python 有趣特性. 我觉得这是一种学习编程语言内部原理的好办法, 而且我相信你也会从中获得乐趣!

如果您是一位经验比较丰富的 Python 程序员, 你可以尝试挑战看是否能一次就找到例子的正确答案. 你可能对其中的一些例子已经比较熟悉了, 那这也许能唤起你当年踩这些坑时的甜蜜回忆 :sweat_smile:

PS: 如果你不是第一次读了, 你可以在这里获取变动内容.

那么, 让我们开始吧…


Fluent Python 01 数据模型与结构

Fluent Python 01 数据模型与结构

Chapter 1 数据模型

Se1 magic method

数据模型在这里的定义是对python框架的描述,他规范了python构建模块的接口;这些接口对应解释器中对一些特殊句法(常用句法)的激活和使用.本章节的核心就在于对这些特殊句法的理解和使用.
特殊方法带来的一些主要交互场景:

  • 迭代
  • 属性访问
  • 集合类
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串的表示形式和格式化
  • 上下文管理模块(with模块)

这些特殊方法的存在实际上,是为了让python的解释器调用,除非我们有大量的元编程,否则我们一般不调用他,通过内置的len等函数进行调用的话,他们的速度更快

下面我们通过最典型的__getitem____len__对其有简单的介绍, 并介绍各个魔术方法的使用场景

Se2 using it and show more

最常用也最典型的magic method 不外乎__getitem____len__;

  • len即对当前对象提供对于通用的len()方法的接口,通常用于查看对象的length or size
  • getitem除了提供obj[index]的索引方式的同时,
    • 他也会对python内置的那些迭代方法提供支持for i in range(b)
    • 对于依托于这些迭代的方法也能够得以支持from random import choice
    • 切片操作

Se2.1 overwrite operator


Python01 数据模型和常用数据结构

Python01 数据模型和常用数据结构

个人的《Python Cookbook》 && 《Fluent Python》阅读笔记。

数据模型(Python结构的通用范式)

(Magic method)dunder method:Python特有的双下划线方法,这些方法能够支持Python进行特殊的调用,实现通用方法在新定义的数据结构上的使用,比如最典型的:

  • __len__()后可以支持len(),获得结构的长度
  • __getitem__()后可以支持data[index]来获取相应的元素,切片,等等数组的操作;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 也可以支持类似如下的一些操作
    # 从数据结构中随机选出一个items
    from random import choice
    choice(datas)
    # 也可以支持迭代方法和反迭代方法
    for data in datas:
    ...
    for data in reversed(datas):
    ...
    # 也可以支持sort函数

到这里也就说明了,只要我们在数据结构(class)中定义了相应的dunder method,该class就能支持相应的一系列操作,getitems就可以类比为列表,相应的操作都能够在python解释器下自动的赋予支持。

还有一些好用但不常用的方法:

  • __contain__实现的是in ,当没有实现contain的方法的时候会按照顺序在list中进行搜索
  • __abs__
  • __repr__实现的是输出的format设置,也就是print的时候的输出形式
  • __eq__ 实现的是 == 命令,同时in调用的是eq

下面附上一张特殊方法表: