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