Python中的二维数组定义 在 Python 中定义二维数组的正确方式应该是使用 for 循环:dp = [[0] * N for _ in range(M)]不应该使用:dp = [[0] * N ] * M一维数组可以用[0]∗N[0] * N[0]∗N 这种声明方式,但是二维数组不能用上面的声明方式,这会导致 dp 中的每行的列表是同一个 id,所以对其中一行的操作都会表现为每一行的操作。...
理解解释器中的JIT机制 原始代码long add4(long num) { return num + 4;}JIT代码0x48, 0x89, 0xf8, // mov %rdi, %rax0x48, 0x83, 0xc0, 0x04, // add $4, %rax0xc3 // r...
常见线程模型 连接独占线程或进程在这个模型中,线程/进程处理来自绑定连接的消息,在连接断开前不退也不做其他事情。当连接数逐渐增多时,线程/进程占用的资源和上下文切换成本会越来越大,性能很差,这就是C10K问题的来源。这种方法常见于早期的web server,现在很少使用。单线程reactor以libevent, libev等event-loop库为典型。这个模型一般由一个event dispatcher等...
信息论(信息熵、KL散度、交叉熵以及互信息) 信息论是一门用数理统计方法来研究信息的度量、传递和变换规律的科学。它主要是研究通讯和控制系统中普遍存在着信息传递的共同规律以及研究最佳解决信息的获限、度量、变换、储存和传递等问题的基础理论。这似乎与概率论和机器学习的关注点相去甚远,但实际上两者之间有着密切的联系。因为简单地表示数据,需要将短码字分配给高概率的位串,并将长码字保留给低概率的位串。这与自然语言中的情况类似,常见的单词(如“a”...
Cache Blocking 背景提高缓存命中率的一个重要技巧是Blocking,数据块将逐块计算,使得存储器访问是一个具有高内存局部性的小邻域。通过在缓存中使用/重用这些数据,我们减少了进入内存的需求(减少内存带宽压力)。Blocking避免了应用程序中的内存带宽瓶颈,可以在1-D,2-D或3-D空间数据结构上执行Blocking。在代码的角度,Blocking通常会涉及到循环拆分和交换。实现1-D Blocki...
CPU Cache 局部性原理程序的运行存在时间和空间上的局部性,前者是指只要内存中的值被换入缓存,今后一段时间内会被多次引用,后者是指该内存附近的值也被换入缓存。如果在编程中特别注意运用局部性原理,就会获得性能上的回报。CacheCache的工作原理是基于程序访问的局部性。对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布...
使用Flex&Bison创建新的编程语言 简介Flex是一个词法分析器,是unix lex的gnu克隆,作用是把"词"抽象成符号,供程序识别。Bison则是一个文法分析器(也是unix yacc的gnu克隆),语法就是在这里定义,是语言设计的核心。如果你需要分析或处理Linux或Unix中的文本数据,可以使用flex和bison迅速解决问题。不但可以应付复杂的语法处理,也可以拿来制作简单的分析器,如配置文件等。...
打印随机森林模型预测样本的决策路径 import numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classificationfrom sklearn.ensemble import RandomForestClassifierX, y = make_classificatio...
NCNN模型部署 自定义项目的CMake配置# 最低CMake版本要求cmake_minimum_required(VERSION 3.14.5)# 项目名称project(NCNN_TEST)# 查找OpenCVfind_package(OpenCV REQUIRED)# OpenCV4编译需要使用C++11set(CMAKE_CXX_STANDARD 11)# ncnn项目所在路径,需要...
TVM简介 TVM软件栈工作流程从已有的深度学习框架中获取一个模型并将此模型转换为计算图表示(深度学习框架的前端主要是计算图表示以及自动梯度);图中 Section 3 使用一些方法优化当前的计算图得到优化后的计算图(操作融合,可以将多个操作合并为一个kernel,以此节省存储中间结果的空间;数据布局转换,改变计算图中张量的存储方式以适应目标硬件设备并提升执行效率);图中 Section 4 针对...
GAN综述 GANGAN的优化是一个极小极大博弈问题;minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]\mathop{min}\limits_{G}\mathop{max}\limits_{D}V(D, G) = E_{x\sim p_{data}(x)}[\log{D(x)}] + E_{z\sim p_{z}(z)}[\lo...
LR+GBDT的工作原理 简介因为梯度提升树训练过于复杂,而逻辑回归过于简单,只能发现线性简单,而对于交互项和非线性关系没有辨识度。于是用梯度提升树训练模型,基于树模型,就有了交叉和非线性,然后把叶子节点放到逻辑回归模型里,解决了逻辑回归算法的缺点。简单来说,就是将梯度提升树的输出作为逻辑回归的输入,最终得到逻辑回归模型。如梯度提升树中有三棵树,T1T_1T1、T2T_2T2和T3T_3T3,每棵树的叶子节点...
k-means 简介K-均值算法的基本思想是首先从含有N个数据对象的数据集中随机选择K个数据对象作为初始中心,然后计算每个数据对象到各中心的距离,根据最近邻原则,所有数据对象将会被划分到离它最近的那个中心所代表的簇中,接着分别计算新生成的各个簇中数据对象的均值作为各簇新的中心,比较新的中心和上一次得到的中心,如果新的中心没有发生变化,则算法收敛,输出结果,如果新的中心和上一次的中心相比发生变化,则要根据新的中心...
编程范式 编程范式事件驱动是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。异步编程风格:事件驱动+回调(Nodejs、Libevent等)协程(Python、Go等)...
Hadoop集群中的自定义Python环境 虚拟环境创建新建纯净版的虚拟环境virtualenv --no-site-packages venv修改虚拟环境为可迁移状态virtualenv --relocatable venv激活虚拟环境source venv/bin/activate虚拟环境安装包pip install <package> -i <url>退出虚拟环境deactivate打包...
使用Prometheus实现监控 介绍Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes ...
字符串模式匹配 # -*- encoding:utf-8 -*__all__ = ['Ahocorasick', ]class Node(object): def __init__(self): self.next = {} self.fail = None self.isWord = Falseclass Ahocorasick(objec...
基于邻域的推荐算法 User-Based用户相似度:wuv=∣N(u)∩N(v)∣∣N(u)∪N(v)∣w_{uv} = \frac{|N(u) \cap N(v)|}{|N(u) \cup N(v)|}wuv=∣N(u)∪N(v)∣∣N(u)∩N(v)∣wuv=∣N(u)∩N(v)∣∣N(u)∣∣N(v)∣w_{uv} = \frac{|N(u) \cap N(v)|}{\sqrt{|N(u)| |N(...