首页 文章 精选 留言 我的

精选列表

搜索[天玑9500],共10000篇文章
优秀的个人博客,低调大师

第 81 天:NumPy Ndarray 对象及数据类型

上一篇文章中我们详细介绍了 NumPy 的功能及用途,本章节着重介绍 NumPy 一个神奇的对象 Ndarray 以及 NumPy 数据类型,包括两者的用途,接下来就开启神奇之旅吧。 标准安装的 Python 中用列表 (list) 保存一组值,它可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。 此外 Python 还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。 NumPy 的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray (下文统一称之为数组)是存储单一数据类型的多维数组,而 ufunc 则是能够对数组进行处理的函数。 一、NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,Ndarray 从名字组成上看是 Nd-array,顾名思义就是 N 维数组的意思,它是一系列多维且同类型数据的集合,以 下标为 0 开始进行集合中元素的索引。ndarray 是内存存储,换言之 ndarray 对象由计算机内存的连续一部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置,它比列表存储节省空间 ndarray 对象是用于存放同类型元素的多维数组。 ndarray 中的每个元素在内存中都有相同存储大小的区域。 1、ndarray 内部内容组成 一个指向数据(内存或内存映射文件中的一块数据)的指针。 数据类型或 dtype,描述在数组中的固定大小值的格子。 一个表示数组形状(shape)的元组,表示各维度大小的元组。 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。 2、ndarray 的内部结构 ndarray 内部结构 3、创建 ndarray fromnumpyimport*eye(4)Out[3]:array([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]]) 由以上实例可知,创建一个 ndarray 只需调用 NumPy 的 array 函数即可,如下: numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0) 3.1 参数说明 名称 描述 object 数组或嵌套的数列 dtype 数组元素的数据类型,可选 copy 对象是否需要复制,可选 order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) subok 默认返回一个与基类类型一致的数组 ndmin 指定生成数组的最小维度 值得注意的是:ndmin 默认为数值为 0 3.2 运用实例 创建一个简单的 ndarray 对象,单维数组 importnumpyasnpa=np.array([1,2,3])print(a) 输出结果如下: [123] 创建一个大于 1 维的数组 importnumpyasnpa=np.array([[1,2],[3,4]])print(a) 输出结果如下: [[12][34]] 使用最小维度参数指定维度 以下实例指定数组维度为 2 维,ndmin 默认维度是 0 importnumpyasnpa=np.array([1,2,3,4,5],ndmin=2)print(a) 输出结果为: [[1,2,3,4,5]] 使用 dtype 参数指定数组元素的数据类型 importnumpyasnpa=np.array([1,2,3],dtype=complex)print(a) 输出结果: [1.+0.j 2.+0.j 3.+0.j] 二、NumPy 数据类型 NumPy 支持的数据类型比 Python 内置的类型要更多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。 1、NumPy 常用数据类型 下表列举了 NumPy 常用基本数据类型,为了区别于 Python 原生的数据类型,bool、int、float、complex、str 等类型名称末尾都加了 _。 名称 描述 bool_ 布尔型数据类型(True 或者 False) int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) intc 与 C 的 int 类型一样,一般是 int32 或 int 64 intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) int8 字节(-128 to 127) int16 整数(-32768 to 32767) int32 整数(-2147483648 to 2147483647) int64 整数(-9223372036854775808 to 9223372036854775807) uint8 无符号整数(0 to 255) uint16 无符号整数(0 to 65535) uint32 无符号整数(0 to 4294967295) uint64 无符号整数(0 to 18446744073709551615) float_ float64 类型的简写 float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 complex_ complex128 类型的简写,即 128 位复数 complex64 复数,表示双 32 位浮点数(实数部分和虚数部分) complex128 复数,表示双 64 位浮点数(实数部分和虚数部分) 另外 numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。 2、数据类型对象-dtype 数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面: 数据的类型(整数,浮点数或者 Python 对象) 数据的大小(例如, 整数使用多少个字节存储) 数据的字节顺序(小端法或大端法) 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分 如果数据类型是子数组,它的形状和数据类型 字节顺序是通过对数据类型预先设定"<"或">"来决定的。"<"意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。">"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。 dtype 对象是使用以下语法构造的: numpy.dtype(object,align,copy) object - 要转换为的数据类型对象 align - 如果为 true,填充字段使其类似 C 的结构体。 copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用 实例操作: 实例 1 importnumpyasnp#使用标量类型da=np.array([1,2,3])print(da.dtype) 输出结果为: int32 实例 2 importnumpyasnp#int8,int16,int32,int64四种数据类型可以使用字符串'i1','i2','i4','i8'代替dt=np.dtype('i4')print(dt) 输出结果为: int32 3、结构化数据类型的运用 结构化数据类型的使用,类型字段和对应的实际类型将被创建 实例1:创建年龄数组并且应用于 ndarray 对象 1)创建一个结构化数据类型 da = np.dtype(np.int64)print(da)# 创建dt = np.dtype([('age',np.int8)])print(dt) 输出结果为: int64[('age','i1')] 2)将结构化数据类型应用于ndarray 对象 dt=np.dtype([('age',np.int8)])a=np.array([(10,),(20,),(30,)],dtype=dt)print(a) 输出结果为: [(10,)(20,)(30,)] 3) 类型字段名可以用于存取实际的 age 列 dt=np.dtype([('age',np.int8)])a=np.array([(10,),(20,),(30,)],dtype=dt)print(a['age']) 输出结果为: [102030] 实例2:定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。 1) 创建数组 student=np.dtype([('name','S20'),('age','i1'),('marks','f4')])print(student) 输出结果: [('name','S20'),('age','i1'),('marks','<f4')] 2) 将数组应用与 ndarray 对象 importnumpyasnpstudent=np.dtype([('name','S20'),('age','i1'),('marks','f4')])a=np.array([('abc',21,50),('xyz',18,75)],dtype=student)print(a) 输出结果为: [(b'abc',21,50.)(b'xyz',18,75.)] 3.1 内建类型的字符代码如下: 字符 对应类型 b 布尔型 i (有符号) 整型 u 无符号整型 integer f 浮点型 c 复数浮点型 m timedelta(时间间隔) M datetime(日期时间) O (Python) 对象 S, a (byte-)字符串 U Unicode V 原始数据 (void) 3.2 NumPy 数据类型转换 numpy 数据类型转换需要调用方法 astype(),不能直接修改 dtype。调用 astype 返回数据类型修改后的数据,但是源数据的类型不会变,需要进一步对源数据的赋值操作才能改变。 实例: da = np.array([1.2,1.1,1.0])# 输出 da 的数据类型print(da.dtype)# 输出 float64# 转换 da 的数据类型print(da.astype(np.int32))# 输出 [1 1 1]# 重新查看数据类型,发现数据类型还未改变print(da.dtype)# 输出 float64# 重新进行赋值操作da = da.astype(np.int32)print(da.dtype) # 输出int32print(da)# 输出 [1 1 1] 4、复数 我们把形如 z=a+bi(a, b均为实数)的数称为复数,其中 a 称为实部,b 称为虚部,i 称为虚数单位。 当虚部 b=0 时,复数 z 是实数;当虚部 b!=0 时,复数 z 是虚数;当虚部 b!=0 ,且实部 a=0 时,复数 z 是纯虚数。 实例: importnumpyasnpa=np.array([1,2,3],dtype=complex)print(a) 输出: [1.+0.j2.+0.j3.+0.j] 如上输出结果就是复数形式的数据类型 总结 本章节是对 NumPy Ndarray 对象及 NumPy 数据类型的用法作详细介绍,本文介绍的是 Ndarray 基础知识,等把 NumPy 所有知识点介绍完后会出一些项目实战,更好的给运用 NumPy 相关知识点的工程师提供支撑。 参考 https://www.runoob.com/numpy/numpy-ndarray-object.html https://www.runoob.com/numpy/numpy-dtype.html 文中示例代码:python-100-days

优秀的个人博客,低调大师

倒计时 100 天!优麒麟 20.10 发布计划!

随着优麒麟 20.04 LTS 的发布,用户和开发者们将注意力转移到了即将发布的优麒麟 20.10 上。优麒麟 20.10 是一个短期支持版本,也将是优麒麟官方发布的第 16 个版本,代号为 “Groovy Gorilla”(意为:极好的大猩猩),目前处于开发阶段,官方将提供 9 个月的支持周期,包括持续的核心bug修复、安全补丁和新的应用程序发布。 优麒麟 20.10 里程碑 优麒麟 20.10 的发布日期是 2020 年 10 月 22 日,开发周期中的其他重要里程碑包括: 发布时间表 2020/08/27 功能冻结 2020/09/03 测试周 2020/09/17 UI 冻结 2020/10/01 优麒麟 20.10 Beta 版本发布 2020/10/08 内核冻结 2020/10/05 版本冻结,候选发布 2020/10/22 优麒麟 20.10 版本发布 优麒麟 20.10 变化 Linux Kernel 5.6 优麒麟 20.10 版本将默认集成 Kernel 5.6 或以上版本。Linux Kernel 5.6 发布版中值得期待的关键更改和功能: 支持 WireGuard 支持 USB 4.0 使用 LZO/LZ4 算法压缩 F2FS 数据 解决 32 位系统的 2038 年问题 改进硬件支持 支持 MX Master 3 鼠标以及罗技其他无线产品 改进 AMD Zen 的温度/功率报告 修复华硕飞行堡垒系列笔记本中 AMD CPU 过热 支持 NVIDIA RTX 2000 图灵系列显卡 内建 FSCRYPT 加密 UKUI 3.0 正式版 优麒麟 20.04 LTS默认集成 UKUI 3.0 预览版,受到了国内外爱好者的广泛好评,我们戒骄戒躁,继续前行,将在优麒麟 20.10 版本中呈现 UKUI 3.0 正式版本。 UKUI 3.0 正式版相较于预览版本,在 UI 方面,将会有多达上百处的细节优化,以及动画效果的优化;功能方面,将会继续秉承“友好易用,简单轻松”的设计理念,提供更多贴心的操作,以及繁琐操作的简化。 麒麟自研应用 优麒麟官方针对用户使用需求,开发了几款常用应用,目前仍在积极测试和完善阶段,最终也将集成进优麒麟 20.10 正式版本中。 优麒麟 20.10 正式版本将于 2020 年 10 月 22 日与 Ubuntu 官方及其它衍生版本全球同步发布,敬请期待!

优秀的个人博客,低调大师

第一天 负载均衡之高并发发送

高并发发送: 1处:负载均衡 2处:数据库 在APP服务器多台情况下,如果用户登录,session怎么处理? 本文来源:凯哥Java(kaigejava) 个人博客:www.kaigejava.com 如下图: 说明: 如果用户登录的时候负载到01服务器上,当用户在操作其他的时候,如果被负载到02机器上。这个时候02机器上面就没有当前用户的session。用户就会被转跳到登陆页面。 解决方案: 1:可以把用户的session放置到cookie中 优点:解决了session没有的问题 缺点:session放在了用户的浏览器中,是不安全的 2:可以把用户的session放置到数据库中 优点:解决了session没有的问题 缺点:当用户量很大的时候,如果把session放置到数据库中,会造成数据库压力过大。从而使数据库运行不正常 3:可以把用户的session放在缓存服务器中 最好的解决的方案是:放在缓存服务器中。这里推荐两种缓存服务器:memcached、redis 要求:memcached/redis必须是集群 4:tomcat共享session 缺点:当tomcat数量过多的时候及其影响性能。所以不推荐 数据库并发: 1 要求:随着业务量的增大,数据库库承载能力也要增大 2 数据安全,不能丢失 3 支持备份+容灾 高并发解决发展阶段: 初级阶段:系统或服务器级别就诶接方案 总结一句话:初级阶段怼硬件(服务器级别) 接着随着业务量的不断增加,硬件成本水涨船高。就进入了第二阶段:应用级别的解决方案 总结一句话:应用级别处理。 业务量继续增加:进入第三阶段: 增加了应用服务器的数量,随之而来的问题又来了。 问题1:用户访问ip多了,怎么解决? 多台应该服务器。每台对应的ip肯定不一样。 问题2:数据库出现了瓶颈,怎么解决? 解决用户IP多的办法一: 使用DNS进行解析。 DNS定义: DNS解析多ip思路: 循环复用DNS。 缺点: 终极解决方案: 负载均衡工作原理分析: 说明: 1:在用户请求,转发请求的功能 2:如果这一台机器挂了 负载均衡服务会不会继续把请求转发给这台服务器呢? 答案:不会 3:如果这一台机器恢复正常了 负载均衡服务器会不会把它添加回来呢? 答案:会的 三大功能 一:转发 二:故障移除 三:恢复添加 负载均衡的种类: 1)一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的 2)一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略.

优秀的个人博客,低调大师

第193天:js---Math+Error+Number+Object总结

一、Math 随机选取 1 //随机选取 2 function getRandom (begin,end){ 3 return Math.floor(Math.random()*(end-begin))+begin; 4 } 二、Error 1、try---catch 1 function message() 2 { 3 adddlert('欢迎来到百度贴吧'); 4 } 5 6 function message() 7 { 8 try{ 9 adddlert('欢迎来到百度贴吧'); 10 }catch(e){ 11 alert('代码出错,系统出错提示:'+'\n'+ e.message+'\n'+ e.name); 12 } 13 } 运行结果: 2、error---onerror 1 function message() 2 { 3 adddlert('欢迎来到百度贴吧') 4 } 5 // onerror函数的三个参数用于确定错误确切的信息,代表的意思依次为: 6 // 错误信息; 7 // 发生错误的文件; 8 // 发生错误的行号。 9 10 window.onload=function(){ 11 message(); 12 } 13 window.onerror = function(msg, file, line) { 14 alert("错误信息: " + "\n"+ msg + "\n" + '出错行数' + ":" + line+'\n'+'报错的文件'+file); 15 return true; 16 } 运行结果: 三、Number 1 /*数字的分类*/ 2 3 //数字的分类: 4 // JavaScript 中可以使用10进制数、8进制数、16进制数、实数、浮点数。 5 // 以 0 开头的整数是8进制数, 6 // 以 0x 开头的整数是16进制数。 7 8 console.log(12345) // 10进制数 12345 9 console.log(1.23) // 实数 1.23 10 console.log(1.23e4) // 1.23 × 10的4次方 11 console.log(1.23E4) // 1.23 × 10的4次方 12 console.log(0777) // 8进制数777 13 console.log(0xff88) // 16进制数FF88 14 15 //通过传统方式 16 var num1 = 1; 17 //通过对象方式 18 var num2 = new Number(3);// 19 console.log(num1);//1 20 console.log(num2);//Number 四、Object 1 // tostring方法其实是object的方法,而其他所有对象都能访问到该属性 2 // 为什么呢。万物都继承在object 3 4 // var obj = new Object() 5 for( var obj in Object) 6 { 7 console.log(obj); 8 }

优秀的个人博客,低调大师

4天完成一个物联网项目

据Gartner预测,2017年将是物联网进入爆发式发展的一年。在这个过程中,系统集成商的大量参与则是物联网快速发展的助推剂。 我们眼中的系统集成商 物联网是一个非常复杂的生态系统,它涵盖了很多部分,包括:传感器或终端设备、网络连接、平台和商业模式等。 在物联网生态中,没有一家供应商能够提供覆盖所有的端到端的解决方案,同时,我们也希望这种事情不会发生。 ——Axonize营销副总裁:Shahar Peleg 如果你使用了某家公司的终端设备,那么这就意味着你的物联网应用将会受限于这些设备所拥有的功能。同样的道理,如果你的公司是一家设备供应商,那么所接入的平台同样也会对你的设备有所限制。 然而,物联网的真正价值在于其无限的可能性,我们应该要能够根据自身的需求出发选择最合适的方案,实现收益最大化。 在这种情况下,能够提供复杂的、灵活

优秀的个人博客,低调大师

第146天:移动H5前端性能优化

移动H5前端性能优化 一、概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点,首屏加载3秒完成或使用Loading 4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB 5. Mobile侧因手机配置原因,除加载外渲染速度也是优化重点 6. 基于第五点,要合理处理代码减少渲染损耗 7. 基于第二、第五点,所有影响首屏加载和渲染的代码应在处理逻辑中后置 8. 加载完成后用户交互使用时也需注意性能 二、优化方案 1、[加载优化] 加载过程是最为耗时的过程,可能会占到总耗时的80%时间,因此是优化的重点 · 减少HTTP请求 因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个 a) 合并CSS、JavaScript b) 合并小图片,使用雪碧图 · 缓存 使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使用时间戳) a) 缓存一切可缓存的资源 b) 使用长Cache(使用时间戳更新Cache) c) 使用外联式引用CSS、JavaScript · 压缩HTML、CSS、JavaScript 减少资源大小可以加快网页显示速度,所以要对HTML、CSS、JavaScript等进行代码压缩,并在服务器端设置GZip a) 压缩(例如,多余的空格、换行符和缩进) b) 启用Gzip · 无阻塞 写在HTML头部的JavaScript(无异步),和写在HTML标签中的Style会阻塞页面的渲染,因此CSS放在页面头部并使用Link方式引入,避免在HTML标签中写Style,JavaScript放在页面尾部或使用异步方式加载 · 使用首屏加载 首屏的快速显示,可以大大提升用户对页面速度的感知,因此应尽量针对首屏的快速显示做优化 · 按需加载 将不影响首屏的资源和当前屏幕资源不用的资源放到用户需要时才加载,可以大大提升重要资源的显示速度和降低总体流量 PS:按需加载会导致大量重绘,影响渲染性能 a) LazyLoad b) 滚屏加载 c) 通过Media Query加载 · 预加载 大型重资源页面(如游戏)可使用增加Loading的方法,资源加载完成后再显示页面。但Loading时间过长,会造成用户流失 对用户行为分析,可以在当前页加载下一页资源,提升速度 a) 可感知Loading(如进入空间游戏的Loading) b) 不可感知的Loading(如提前加载下一页) · 压缩图片 图片是最占流量的资源,因此尽量避免使用他,使用时选择最合适的格式(实现需求的前提下,以大小判断),合适的大小,然后使用智图压缩,同时在代码中用Srcset来按需显示 PS:过度压缩图片大小影响图片显示效果 a) 使用智图( [http://zhitu.tencent.com/](http://zhitu.tencent.com/) ) b) 使用其它方式代替图片(1. 使用CSS3 2. 使用SVG 3. 使用IconFont) c) 使用Srcset d) 选择合适的图片(1. webP优于JPG 2. PNG8优于GIF) e) 选择合适的大小(1. 首次加载不大于1014KB 2. 不宽于640(基于手机屏幕一般宽度)) · 减少Cookie Cookie会影响加载速度,所以静态资源域名不使用Cookie · 避免重定向 重定向会影响加载速度,所以在服务器正确设置避免重定向 · 异步加载第三方资源 第三方资源不可控会影响页面的加载和显示,因此要异步加载第三方资源 2、[脚本执行优化] 脚本处理不当会阻塞页面加载、渲染,因此在使用时需当注意 (1)CSS写在头部,JavaScript写在尾部或异步 (2)避免图片和iFrame等的空Src 空Src会重新加载当前页面,影响速度和效率 (3)尽量避免重设图片大小 重设图片大小是指在页面、CSS、JavaScript等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能 (4)图片尽量避免使用DataURL DataURL图片没有使用图片的压缩算法文件会变大,并且要解码后再渲染,加载慢耗时长 [CSS优化] (5)尽量避免写在HTML标签中写Style属性 (6)避免CSS表达式 CSS表达式的执行需跳出CSS树的渲染,因此请避免CSS表达式 (7)移除空的CSS规则 空的CSS规则增加了CSS文件的大小,且影响CSS树的执行,所以需移除空的CSS规则 (8)正确使用Display的属性 Display属性会影响页面的渲染,因此请合理使用 a) display:inline后不应该再使用width、height、margin、padding以及float b) display:inline-block后不应该再使用float c) display:block后不应该再使用vertical-align d) display:table-*后不应该再使用margin或者float (9) 不滥用Float Float在渲染时计算量比较大,尽量减少使用 (10)不滥用Web字体 Web字体需要下载,解析,重绘当前页面,尽量减少使用 (11)不声明过多的Font-size 过多的Font-size引发CSS树的效率 (12)值为0时不需要任何单位 为了浏览器的兼容性和性能,值为0时不要带单位 (13)标准化各种浏览器前缀 a) 无前缀应放在最后 b) CSS动画只用 (-webkit- 无前缀)两种即可 c) 其它前缀为 -webkit- -moz- -ms- 无前缀 四种,(-o-Opera浏览器改用blink内核,所以淘汰) (14)避免让选择符看起来像正则表达式 高级选择器执行耗时长且不易读懂,避免使用 3、[JavaScript执行优化] (1)减少重绘和回流 a) 避免不必要的Dom操作 b) 尽量改变Class而不是Style,使用classList代替className c) 避免使用document.write d) 减少drawImage (2)缓存Dom选择与计算 每次Dom选择都要计算,缓存他 (3)缓存列表.length 每次.length都要计算,用一个变量保存这个值 (4)尽量使用事件代理,避免批量绑定事件 (5)尽量使用ID选择器 ID选择器是最快的 (6)TOUCH事件优化 使用touchstart、touchend代替click,因快影响速度快。但应注意Touch响应过快,易引发误操作 4、[渲染优化] (1)HTML使用Viewport Viewport可以加速页面的渲染,请使用以下代码 < meta name=”viewport” content=”width=device-width, initial-scale=1″> (2)减少Dom节点 Dom节点太多影响页面的渲染,应尽量减少Dom节点 (3)动画优化 a) 尽量使用CSS3动画 b) 合理使用requestAnimationFrame动画代替setTimeout c) 适当使用Canvas动画 5个元素以内使用css动画,5个以上使用Canvas动画(iOS8可使用webGL) (4)高频事件优化 Touchmove、Scroll 事件可导致多次渲染 a) 使用requestAnimationFrame监听帧变化,使得在正确的时间进行渲染 b) 增加响应变化的时间间隔,减少重绘次数 (5)GPU加速 CSS中以下属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)来触发GPU渲染,请合理使用

优秀的个人博客,低调大师

第25天,Django之缓存、序列化、信号

目录 一、缓存 1. 配置 1.1 开发调试 1.2 内存 1.3 文件 1.4 数据库 1.5 Memcache缓存(python-memcached模块) 1.6 Memcache缓存(pylibmc模块) 2. 缓存应用 2.1 站点级缓存 2.2 单个视图缓存 2.3 模板片段缓存 二、序列化 1、serializers 2、json.dumps 三、信号 1. Django内置信号 一、缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。 Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcache缓存(pylibmc模块,只是与上面换了个模块而已) 1. 配置 1.1 开发调试 # 此为开始调试用,实际内部不做任何操作 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 'VERSION': 1, # 缓存key的版本(默认1) 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) } } # 自定义key def default_key_func(key, key_prefix, version): """ Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix'. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. """ return '%s:%s:%s' % (key_prefix, version, key) def get_key_func(key_func): """ Function to decide which key function to use. Defaults to ``default_key_func``. """ if key_func is not None: if callable(key_func): return key_func else: return import_string(key_func) return default_key_func 注意:如果不需要自定义缓存的key,可以不用写KEY_PREFIX、VERSION、KEY_FUNCTION以及自定义key的函数。 1.2 内存 # 此缓存将内容保存至内存的变量中 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } } # 注:其他配置同开发调试版本 1.3 文件 # 此缓存将内容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } # 注:其他配置同开发调试版本 1.4 数据库 # 此缓存将内容保存至数据库 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } } # 注:执行创建表命令 python manage.py createcachetable 使用数据库缓存之前,你必须用这个命令来创建缓存表: python manage.py createcachetable 1.5 Memcache缓存(python-memcached模块) Memcached有一个非常好的特点就是可以让几个服务的缓存共享。 这就意味着你可以在多台机器上运行Memcached服务,这些程序将会把这几个机器当做 同一个 缓存,从而不需要复制每个缓存的值在每个机器上。为了使用这个特性,把所有的服务地址放在LOCATION里面,用分号隔开或者当做一个list。 # 此缓存使用python-memcached模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } } 1.6 Memcache缓存(pylibmc模块) # 此缓存使用pylibmc模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } } 2. 缓存应用 缓存应用分为三种模式: 站点级缓存 单个视图缓存 模板片段缓存 2.1 站点级缓存 一旦高速缓存设置,最简单的方法是使用缓存缓存整个网站。 使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ] CACHE_MIDDLEWARE_ALIAS = "" # 用于存储的缓存的别名 CACHE_MIDDLEWARE_SECONDS = "" # 每个page需要被缓存多少秒。这个优先级大于CACHES中的TIMEOUT参数。 CACHE_MIDDLEWARE_KEY_PREFIX = "" # 如果缓存被使用相同Django安装的多个网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。 如果你不在意的话可以设成空字符串。 注意: 'Update'中间件,必须放在列表的开始位置,而Fectch中间件,必须放在最后。 2.2 单个视图缓存 #方式一: from django.views.decorators.cache import cache_page cache_page(60 * 15) # 60秒*15,也就是缓存15分钟 def my_view(request): pass #方式二: from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)), ] 注意:cache_page接受一个参数:timeout,秒为单位。在前例中,“my_view()”视图的结果将被缓存 15 分钟 (注意为了提高可读性我们写了 60 * 15 . 60 * 15 等于 900 –也就是说15分钟等于60秒乘15.) 2.3 模板片段缓存 在模版文件中加入 # a. 引入TemplateTag {% load cache %} # b. 使用缓存 {% cache 5000 缓存key %} 缓存内容 {% endcache %} 注意:5000是指缓存5000秒,缓存的key可以是自定义的字符串。 二、序列化 关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。 1、serializers from django.core import serializers ret = models.BookType.objects.all() data = serializers.serialize("json", ret) 2、json.dumps import json #ret = models.BookType.objects.all().values('caption') ret = models.BookType.objects.all().values_list('caption') ret=list(ret) result = json.dumps(ret) 由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如: import json from datetime import date from datetime import datetime class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): return o.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field, date): return o.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field) # ds = json.dumps(d, cls=JsonCustomEncoder) 三、信号 Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。 1. Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delete # django的modal对象删除前,自动触发 post_delete # django的modal对象删除后,自动触发 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发 Management signals pre_migrate # 执行migrate命令前,自动触发 post_migrate # 执行migrate命令后,自动触发 Request/response signals request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常后,自动触发 Test signals setting_changed # 使用test测试修改配置文件时,自动触发 template_rendered # 使用test测试渲染模板时,自动触发 Database Wrappers connection_created # 创建数据库连接时,自动触发 对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数: 需要将触发信号的代码放在项目下同项目名称的目录下的init.py中,例如django项目名称为myblog,则需要将下列代码写至myblog/myblog/init.py中。 需求:当对某个数据库做写入操作时,就触发某个函数的执行。 from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created def signal(sender,**kwargs): print('Django信号测试') print('sender: ',sender) print('kwargs: ',kwargs) # 调用信号的connect方法,将自定义的函数当作参数传递进去 post_save.connect(signal) # 当对数据库做保存操作时,就会触发上述signal函数的执行 注意:自定义的函数传入一个位置参数sender,它是触发此函数执行的某个模块;kwargs内容请看下面打印结果; # 打印结果如下: # Django信号测试 # sender: <class 'blog.models.Blog'> # kwargs: {'update_fields': None, 'created': True, 'instance': <Blog: 我的python>, 'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E00FD0>, 'using': 'default', 'raw': False}

优秀的个人博客,低调大师

weekend110(Hadoop)的 第四天笔记

课程目录 01-复习 02-hadoop中的序列化机制 03-流量求和mr程序开发 04-hadoop的自定义排序实现 05-mr程序中自定义分组的实现 06-shuffle机制 07-mr程序的组件全貌 08-textinputformat对切片规划的源码分析 09-倒排索引的mr实现 10-多个job在同一个main方法中提交 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5896338.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

假如有一天,AI能自我“繁殖”?

你想过一种能够建设人工智能的人工智能吗?这可能是研究者的梦想,程序员的噩梦。 纽约时报近日就刊登了一篇题为《Building A.I. That Can Build A.I.》的文章,向我们介绍了谷歌AutoML的一些情况,雷锋网在不改变原意的情况下进行了编译。 在最近于硅谷和中国的演讲中,谷歌的大牛Jeff Dean着重介绍了谷歌的AutoML项目。AutoML,顾名思义,就是学习构建其他机器学习算法的机器学习算法。 Jeff Dean是一名出色的计算机科学家和软件工程师,目前,他是谷歌大脑团队中的高级成员(Fellow)。谷歌许多业务的底层架构和系统都是由他参与建设的,如Big Table 和Map Reduce,在国外知乎Quara上,有答主曾如此夸张地形容这位大牛:编译器从不警告Jeff Dean,只有Jeff Dean警告编译

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册