编程进阶:Python、JavaScript、Java
2024-06-07 20:46:55 18 举报
AI智能生成
python,javascript,java的编程特点,编程进阶,效率优化。 该思维导图给出了前端,后端,全栈,容器化,集成部署的相关知识; opt - conde review, frame constructure, python,javascript
作者其他创作
大纲/内容
编程进阶,代码优化
创建一个文件夹用于存放你的虚拟环境,进入到存放虚拟环境的地址
创建虚拟环境:python3 -m venv 你的地址(虚拟环境的名字)
激活虚拟环境: source 创建的虚拟环境地址下的bin/activate
退出虚拟环境:deactivate
使用python自带的env
sudo pip3 install virtualenv
sudo pip3 install virtualenvwrapper
配置virtualenvwrapper
使用virtualenvwrapper
使用virtualenv管理env
方法1. curl https://pyenv.run | bash
方法2. git clone https://github.com/pyenv/pyenv.git ~/.pyenv
安装软件
echo 'export PYENV_ROOT=\"$HOME/.pyenv\"' >> ~/.bashrcecho 'export PATH=\"$PYENV_ROOT/bin:$PATH\"' >> ~/.bashrcecho 'eval \"$(pyenv init --path)\"' >> ~/.bashrc#git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv#echo 'eval \"$(pyenv virtualenv-init -)\"' >> ~/.bashrc然后,重启终端或执行 source ~/.bashrc
配置环境变量
pyenv install 3.10.9
使用 pyenv 安装 Python
pyenv global 3.11
设置全局 Python 版本
pyenv global system
设置系统 Python 版本
pyenv local 3.8
切换本地Python版本
pyenv uninstall 3.11
卸载特定版本的Python
使用pyenv管理python
conda create --name tensorflow python=3.8.10
创建环境
conda env list
查看环境
conda activate tensorflow
激活环境
conda deactivate
推出当前环境
conda remove -n tensorflow --all
删除环境
使用conda管理python/env
使用虚拟环境
这样会污染命名空间,不利于代码的维护和阅读。
from urlib import parse(尽量杜绝使用*)
使用项目绝对路径引入模块,这样可以避免模块名冲突。
import module.submodule,而不是 import submodule
os.getenv() 方法来获取环境变量的值,如果环境变量不存在,则返回默认值。
模块引入优化
使用threading
使用
多进程
使用processing
多线程
asyncio是Python3.4版本引入的标准库,直接内置了对异步IO的支持
使用 async 关键字定义一个协程函数。使用 await 关键字可以等待一个异步操作的完成。协程函数的执行不会阻塞主程序的运行。
案例: 单任务回调
案例:多任务回调+异常
案例:produce & consume
协程的核心思想是通过让程序员控制主动让出执行权,来实现并发执行。
协程能够在某个任务等待 I/O 操作时自动切换到其他任务,从而充分利用 CPU 资源,提高程序效率。
asyncio设计
这个文件定义了事件循环(Event Loop)的基本行为,包括 BaseEventLoop 类、AbstractEventLoop 类等
事件循环是 asyncio 的核心组件,负责调度和执行协程任务,处理异步事件和 IO 操作。它维护了任务队列、定时器、I/O 事件等,并负责将事件发送给对应的处理器。
asyncio.Event 类代表了一个可等待的事件,它通常用于协程之间的同步和通信。通过 set() 和 clear() 方法来设置和清除事件,通过 wait() 方法来等待事件的发生。
asyncio/base_events.py
模块提供了队列(Queue)相关的类,其中最重要的是 asyncio.Queue 类。
队列(Queue)用于协程之间的异步通信和数据传输,它支持生产者和消费者模式。通过 put() 和 get() 方法往队列中添加和获取数据。
asyncio/queues
定义了任务(Task)的相关类和函数,包括 Task 类、ensure_future() 函数等。
任务(Task)是 asyncio 中的核心概念,代表一个异步操作的执行单元。它负责管理协程的执行、状态和结果,是协程的封装和管理者。
Task作用是在运行某个任务的同时可以并发的运行多个任务。通过2个函数创建: asyncio.create_task() 和 asyncio.gather()
asyncio/tasks.py
定义了期物(Future)的相关类和函数,包括 Future 类、wrap_future() 函数等。
Future代表一个异步操作的未来结果,它与任务(Task)类似,但不具有任务的调度和执行能力。它可以设置结果、异常,以及添加回调函数,用于处理异步操
Future 对象表示尚未完成的计算。可以通过 set_result()、set_exception() 方法设置结果或异常,并通过 add_done_callback() 方法添加回调函数处理结果或异常。
asyncio/futures.py
定义了流(Stream)相关的类和函数,包括 StreamReader 类、StreamWriter 类等。
流用于异步读写数据,包括网络数据流、文件数据流等。这个文件定义了异步流的读写接口和处理逻辑,用于实现异步 IO 操作。
asyncio/streams.py
定义了子进程相关的类和函数,包括 SubprocessStreamProtocol 类、SubprocessProtocol 类等。
子进程用于执行独立的外部命令,与主进程异步通信。这个文件定义了异步子进程的协议和处理器,用于管理和处理子进程的执行
asyncio/base_subprocess.py
asyncio组件
EventLoop 管理所有的事件,在整个程序运行过程中不断循环执行并追踪事件(在队列中),空闲时调用相应的事件处理者来处理这些事件。
在实际的应用中,一般会使用事件循环来管理多个协程的执行,以充分利用单线程的并发处理能力。
event_loop
asyncio
Gevent是一个基于Greenlet实现的网络库,通过greenlet实现协程。
1.Greenlet是作为一个C扩展模块,它封装了libevent事件循环的API,让开发者在不改变编程习惯的同时,用同步的方式写异步IO代码。2.在实际的代码里,我们不会用gevent.sleep()去切换协程,而是在执行到IO操作时gevent会自动完成 3.Gevent需要将Python自带的一些标准库的运行方式由阻塞式调用变为协作式运行。这一过程在启动时通过monkey patch完成
使用gevent.spawn
gevent
协程,io多路复用
使用异步编程
可以逐个访问可迭代对象中的元素,而不需要将整个对象加载到内存中。
迭代器通常通过调用iter()函数来创建,并通过next()函数来逐个访问元素。当所有元素都被访问完毕时,迭代器会引发StopIteration异常。
迭代器是一个对象,它实现了__iter__()和__next__()方法
生成器函数使用yield关键字来产生值,而不是使用return关键字。
每次调用生成器函数时,它会返回一个值,并在下一次调用时从上次离开的地方继续执行。生成器可以大大减少内存消耗,并且更加灵活和高效。
特殊的迭代器,也实现了__iter__()和__next__()方法
在处理大型数据集或需要延迟计算的情况下,生成器通常是更好的选择。
特点
生成器是一种特殊的迭代器,它可以通过函数来创建。
是指可以被迭代(遍历)的对象,例如列表、元组、字典、集合等。
在Python中,任何实现了__iter__()方法的对象都是可迭代对象。
可迭代对象
(i for i in range(1000))
def func(): yield obj
使用迭代器/生成器
使用内部函数(基于C语言解释)如:list,dict,join,json,isinstance,id
减少使用全局变量, globe
较少大型变量的存活时间,generator time
attributes, functions
属性和功能封装在基类中
使用局部变量
key in dict()
list[index]
element in list()
避免O(n^m)的时间复杂度
尽量避免O(n^2)的时间复杂度
避免循环嵌套做矩阵运算
序列化的特点
序列化
算法优化
gc.collect()函数可以手动触发垃圾回收
手动回收
避免不必要的变量
gc.garbage属性可以查看被标记为循环引用的对象列表
list,dict,set等容器的相互引用要注意
避免循环引用
通过预加载类、优化类加载顺序和减少类加载次数来优化类加载性能,以加快应用程序的启动速度和减少内存占用。
使用类加载面向对象编程
使用Python的内存分析工具(如memory_profiler)来检测内存泄漏和优化内存使用。
Class interface should fucos one thing.
单一职责原则
Software entities like classes and functions should be open for extension but closed for modification
开闭原则
Functions that use references to base classes must be able to use objects of derived classes without knowing it.
里氏替换原则
The dependency of one class to another one should depend on the smallest possible.
接口隔离原则
High level modules should not depend upon low level modules. Both should depend upon abstract class.
依赖倒置原则
遵循solid原则来规范编程
内存回收、内存优化
它是一个JIT(即时)编译器
使用Numba
使用cPickle
ctypes: 通常用于封装(wrap)C程序,让纯Python程序调用动态链接库(Windows中的dll或Unix中的so文件)中的函数。如果想要在python中使用已经有C类库,使用ctypes是很好的选择,有一些基准测试下,python2+ctypes是性能最好的方式。
cffi: cffi的就是ctypes在pypy中的实现,同进也兼容CPython。cffi提供了在python使用C类库的方式,可以直接在python代码中编写C代码,同时支持链接到已有的C类库。
使用C扩展
使用扩展
Python优化
使用jdk安装,包含jre环境
提升便捷
openjdk-n-jdk指定版本
sudo apt install openjdk-8-jdk
指定版本
环境的安装
private/public
合理使用公有私有
private static final String DRIVERS_CLASS
合理使用静态类型
private final String DRIVERS_CLASS
合理使用常量
合理的定义
样例
。
其他基本类型
整型(int)、浮点型(float、double)、短整型(short)、长整型(long)、字符型(char)、布尔型(boolean)、字节型(byte)、字符串型(String)
字符串重点
循环案例
字符串(单独拎出来)
常用数据类型
查找
修改
数组是一种存储固定大小元素的数据结构,元素的类型可以是基本数据类型或对象。数组的特点是长度固定,通过下标来访问数组中的元素。
数组(Array)
创建样例
查询
集合是一种存储对象的容器,可以动态地添加、删除和修改元素。常见的集合类有List、Set、Stack等。
集合(Collection)
Map是一种键值对的集合,每个键对应一个值。Map中的键是唯一的,值可以重复。
字典 Map
复杂数据类型
高效的数据类型
文件名与公有类名一致
最多一个public类
文件名使用主要功能类名去命名文件
多个类且无public类
使用大驼峰命名类名
类名
优化表达,注意顺序
类属性
private static String personName() {}
(修饰符),(关键字),(函数类型),函数返回,函数名称
类成员
public static void main() {}
入口函数
类构造
参考上述python的多线程,多进程
异步编程
参考上述python算法
JVM(Java Virtual Machine)是Java虚拟机的缩写,是Java程序运行的核心组件。它负责将Java字节码转换为机器码并执行程序。JVM是跨平台的,可以在不同的操作系统上运行Java程序。
Java内存回收机制是指JVM对内存中不再使用的对象进行回收和释放,以便重新利用内存空间。Java内存回收机制主要通过垃圾回收器(Garbage Collector)来实现。垃圾回收器会定期检查内存中的对象,将不再被引用的对象标记为垃圾,释放其占用的内存。
介绍
标记-清除算法(Mark-Sweep):首先标记所有活动对象,然后清除所有未标记的对象。复制算法(Copying):将内存分为两块,每次只使用其中一块,当一块内存满了之后,将存活的对象复制到另一块内存中,然后清除原来的内存。标记-整理算法(Mark-Compact):首先标记所有活动对象,然后将活动对象向一端移动,清除另一端的垃圾对象。
原理
垃圾收集器选择:JVM提供了不同类型的垃圾收集器,如串行收集器、并行收集器、CMS收集器和G1收集器等。调优堆内存大小:通过调整堆内存大小可以减少垃圾收集的频率和提高应用程序的性能。可以通过-Xms和-Xmx参数来设置堆内存的初始大小和最大大小。调优GC参数:可以通过调整GC参数来优化垃圾收集器的性能,如设置新生代和老年代的比例、设置GC的触发条件等。使用局部变量:尽量使用局部变量而不是全局变量,可以减少对象的生命周期,从而减少垃圾收集的压力。类加载:通过预加载类、优化类加载顺序和减少类加载次数来优化类加载性能,以加快应用程序的启动速度和减少内存占用。线程管理:通过调整线程池大小、线程优先级和线程调度策略来优化线程管理,以提高并发性能和减少线程竞争。JIT编译器:通过调整JIT编译器的参数和优化编译过程来提高代码执行速度和减少编译时间。内存分析和调优:使用工具如VisualVM、JProfiler等进行内存分析,找出内存泄漏和性能瓶颈,并进行相应的调优。
优化手段
JVM优化
Java 优化
brew install nodejs
mac
apt install nodejs==8.0
linux
https://nodejs.org/zh-cn/download
windows
安装nodejs环境
删除多余的依赖库
删除滥用的npm包
避免未使用的js代码
使用数组,对象直接构建的方式
使用数组,对象去查询,调用
避免数组和对象操作使用构造函数
SessionStorage:数据存储在用户会话期间,即当用户关闭浏览器窗口或标签时数据将被清除。
数据仅在当前会话中有效,不同标签页或窗口之间无法共享数据。
SessionStorage通常用于存储临时数据,比如用户在网页上填写的表单数据或临时状态信息。
SessionStorage
LocalStorage:数据存储在用户本地,即使用户关闭浏览器或重启电脑,数据仍然保留。
数据在同一域名下的所有页面之间共享,不同标签页或窗口也可以共享数据。
LocalStorage通常用于存储持久化数据,比如用户的偏好设置、登录状态等。
LocalStorage
Cookies
Memory Cache:
js的缓存
合理使用缓存机制
减少循环中的活动
减少不必要的变量
尽量避免使用非必要的全局变量
判断多,越倾向于使用 switch 而不是 if-else
修改CSS样式时,最好不要直接写样式,而是替换 class 来改变样式
要对 DOM 元素执行一系列操作,可以将 DOM 元素脱离文档流,修改完成后,再将它带回文档
使用事件委托
合理的算法、编码
一个完整的 HTTP 请求需要经历 DNS 查找,TCP 握手,浏览器发出 HTTP 请求,服务器接收请求,服务器处理请求并发回响应
减少 HTTP 请求
多路复用
优先级,流量控制
服务器可以主动推送
使用 HTTP2
考虑一些css放头部,js放尾部
异步
响应式
使用 webp 格式的图片
使用css3的样式图
加载图片
优化请求
Javascript优化
https://www.processon.com/view/6575827967b30d6723ec0159
容器化
集群部署
0 条评论
回复 删除
下一页