什么是GIL锁
GIL,是最流行在 Python 解释器 CPython 中的一个技术术语。它的意思是全局解释器锁,本质上是类似操作系统的 Mutex。每一个 Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。
CPython会轮流执行 Python 线程。这样一来,用户就会看到线程交替执行,似乎是并行,但是其实只有一个线程在运行。现在都是多核CPU,可以实现线程的并行运行,所以Python中并不是和使用多线程。
GIL如何工作
下面这张图,就是一个 GIL 在 Python 程序的工作示例。其中,Thread 1、2、3 轮流执行,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行;同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源。
CPython 中还有另一个机制,叫做 check_interval,意思是 CPython 解释器会去轮询检查线程 GIL 的锁住情况。每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会。
如何绕过GIL
上面提到,Python不适合多线程工作(除非Python在未来的版本取消掉GIL),如果强行使用多线程,它的运行效率可能还低于单线程。
解决问题的一个好办法就是避免问题,在程序对性能要求高的情况下,我们不妨使用以下几种办法:
- 使用第三方库。很多高性能应用场景都已经有大量的 C 实现的 Python 库,例如 NumPy 的矩阵运算,就都是通过 C 来实现的,并不受 GIL 影响。
- 使用Python的多进程+协程。Python3.5提供了对异步的支持,3.6+使用更方便,这是一个不错的选择。
- 使用其他Python解释器,比如JPython,但是使用第三方一般会比官方慢几个版本,且很多三方库都不支持。
Original: https://blog.51cto.com/u_15722381/5483114
Author: ch3nnn
Title: Python GIL锁
相关阅读1
Title: nnUNet使用指南(一):Ubuntu系统下使用nnUNet对自己的多模态MR数据集训练
nnUNet的安装
安装python虚拟环境(作者不建议使用conda环境)
sudo apt-get install -y python3-venv
或
pip install virtualenv
创建虚拟环境文件夹
选择要将Python编程环境放入哪个目录,或者我们可以使用来创建一个新目录mkdir
mkdir environments
进入文件夹
cd environments
创建虚拟环境
python3 -m venv project_env
project_env
是虚拟环境的名字,建议命为nnunet, 方便记忆
或
virtualenv nnunet --python=python3.8
指定版本
使用时需要激活该环境
source nnunet/bin/activate
激活要先切换到nnunet的上一级文件夹(也就是environment文件夹)
要离开环境,只需键入命令 deactivate
安装nnUNet
在虚拟环境中键入 pip install nnunet
pip list
查看安装了哪些包
设置环境变量
这一步对于nnUNet来讲很重要,nnU-Net需要知道您打算将原始数据,预处理数据和训练好的的模型保存在何处
进入文件bashrc文件 vim ~/.bashrc
按i键对文件进行修改
将以下行放入文件最后
export nnUNet_raw_data_base="/media/fabian/nnUNet_raw"
export nnUNet_preprocessed="/media/fabian/nnUNet_preprocessed"
export RESULTS_FOLDER="/media/fabian/nnUNet_trained_models"
/media/fabian/改为你自己的地址,下面要有这三个文件夹
Esc + :+ wq 退出并保存修改之后的文件
成功设置后,您可以通过键入 echo $RESULTS_FOLDER etc
来验证路径设置正确,并且应该打印出正确的文件夹
注意
安装nnU-Net将向您的终端添加几个新命令。这些命令用于运行整个nnU-Net管道。您可以从系统上的任何位置执行它们。
所有nnU-Net命令的前缀都有 nnUNet_ 这样易于识别。如训练命令nnUNet_train
请注意,这些命令仅执行python脚本。如果在虚拟环境中安装了nnU-Net,则在执行命令时必须激活该环境。
所有nnU-Net命令都有一个-h选项,该选项提供有关如何使用它们的信息
私有数据预处理
nnU-Net的所有数据集都存放在 nnUNet_raw/nnUNet_raw_data
文件夹(上面安装nnU-Net时指定了该文件夹的地址)
建立Task文件夹
在 nnUNet_raw_data
文件夹下建立Task066_LiverTumer文件夹(举例说明,改成你自己的ID和name)
统一命名为("Task""ID"_"任务名称"), "ID"是必须是三位数的整数,066而不是66
在每一个Task文件夹里,又包含以下文件
imagesTr
: 训练图像文件夹。
imagesTs
(可选): 测试图像文件夹
labelTr
: 训练集标签文件夹。
dataset.json
: 包含数据集的元数据的JSON文件, 如任务名字,模态,标签含义,训练集包含的图像地址等
图像的处理
图像的统一命名格式 case_identifier_XXXX.nii.gz
, 标签的统一命名格式 case_identifier.nii.gz
例如 mr_001_0000,mr_001_0001
=> mr_001
可以写一个python文件将自己原本数据集里的数据导入并重命名为标准格式(必须是从nii压缩为nii.gz,不能是重命名)
可以在文件夹用终端打开,用 gzip *
可将文件夹内所有不是.gz的文件压缩为.gz
要注意每个图像所有的模态必须相同,不能少
json文件
数据统一格式录入文件夹后,生成json文件,这里可以参考我写的(需要留言,比较懒)
开跑
数据验证
验证通过会自动进行下一步预处理,如果已经验证过,可以去掉--之后的内容,直接开始预处理
66那里填上自己的ID
nnUNet_plan_and_preprocess -t 66 --verify_dataset_integrity
训练
nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD --npz (additional options)
--npz不需要softmax输出时不要加,会占用大量空间,详情见github说明
举例:
nnUNet_train 2d nnUNetTrainerV2 66 4
66 处填写任务ID
nnUNetTrainerV2 是要用到的使用的model trainer
4 是五折交叉验证的第几折(可选0,1,2,3,4)
2D U-Net:
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 2d nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
3D full resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_fullres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
3D U-Net cascade
3D low resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_lowres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
3D full resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_cascade_fullres nnUNetTrainerV2CascadeFullRes TaskXXX_MYTASK FOLD --npz
注意:cascade的3D全分辨率UNet需要事先完成低分辨率UNet的五折
经过培训的模型将被写入RESULTS_FOLDER/nnUNet文件夹。每次训练都会获得自动生成的输出文件夹名称:
nnUNet_preprocessed/CONFIGURATION/TaskXXX_MYTASKNAME/TRAINER_CLASS_NAME__PLANS_FILE_NAME/FOLD
1000轮太多了,自定义epoch
修改这里:
在nnunet虚拟环境里找到nnunet文件夹
不起作用,修改这里:
手动选择预测模型
nnUNet_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -t TASK_NAME_OR_ID -m CONFIGURATION
INPUT_FOLDER: 测试数据地址
OUTPUT_FOLDER: 分割数据存放地址
CONFIGURATION: 使用的什么架构,2d or 3d_fullres or 3d_cascade_fullres等
举例:
nnUNet_predict -i /home/.../nnunet_file/nnUNet_raw/nnUNet_raw_data/Task066_LiverTumer/imagesTs -o /home/.../nnunet_file/output -t 66 -m 2d -f 4
自动选择最佳模型
pass
参考:
不用写代码神器!教你用4行命令轻松使用nnUNet训练自己的医学图像分割模型
nnUNet最舒服的训练教程(让我的奶奶也会用nnUNet(上))Original: https://www.cnblogs.com/xyf9474/p/16198524.html
Author: 梅雨明夏
Title: nnUNet使用指南(一):Ubuntu系统下使用nnUNet对自己的多模态MR数据集训练
相关阅读2
Title: Python入门之——IPy模块
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包含网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等。Python提供了一个强大的第三方模块IPy(https://github.com/haypo/python-ipy/),最新版本为V0.81。IPy模块可以很好地辅助我们高效完成IP的规划工作。
源码安装
wget https://pypi.pythin.org/packages/source/I/IPy/IPy-0.81.tar.gz --no-check-certificatetar -zxvf IPy-0.81.tar.gzcd IPy-0.81python setup.py install
IP地址、网段的基本处理
IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。比如通过version方法就可以区分出IPv4与IPv6,如:
IP('10.0.0.0/8').version()4 #4代表IPv4类型IP('::1/8').version()6 #6代表IPv6类型
通过指定的网段输出该网段的IP个数及所有IP地址清单,代码如下:
from IPy import IPip = IP('192.168.0.0/16')print ip.len() #输出192.168.0.0/16网段的IP个数for x in ip: #输出192.168.0.0/16网段的IP清单 print(x)
反向解析名称、IP类型、IP转换等
>> from IPy import IP>> ip = IP('192.168.1.20')>> ip.reverseNames() # 反向解析地址格式['20.1.168.192.in-addr.arpa.']>> ip.iptype() # 192.168.1.20为私网类型PRIVATE>> IP('8.8.8.8').iptype() # 8.8.8.8为公网类型'PUBLIC'>> IP('8.8.8.8').int() # 转换成整型格式134744072>> IP('8.8.8.8').strHex() # 转换成十六进制格式'0x8080808'>> IP('8.8.8.8').strBin() # 转换成二进制格式'00001000000010000000100000001000'>> print(IP(0x8080808)) # 十六进制转成IP格式
IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:
from IPy import IPprint(IP('192.168.1.0').make_net('255.255.255.0'))192.168.1.0/24print(IP('192.168.1.0/255.255.255.0'. make_net=True))192.168.1.0/24print(IP('192.168.1.0-192.168.1.255'. make_net=True))192.168.1.0/24
也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。输出类型为字符串,如下:
IP('192.168.1.0/24').strNormal(0)'192.168.1.0'IP('192.168.1.0/24').strNormal(1)'192.168.1.0/24'IP('192.168.1.0/24').strNormal(2)'192.168.1.0/255.255.255.0'IP('192.168.1.0/24').strNormal(3)'192.168.1.0-192.168.1.255'
多网络计算方法详解
有时候我们想比较两个网段是否存在包含、重叠等等关系,比如同网络但不同prefixlen会认为是不相等的网段,如10.0.0.0/16不等于10.0.0.0/24,另外即使具有相同的prefixlen但处于不同的网络地址,同样也视为不等,如10.0.0.0/16不等于192.0.0.0/16。IPy支持类似于数值型数据的比较,以帮助IP对象进行比较,如:
IP('10.0.0.0/24') < IP('12.0.0.0/24')True
判断IP地址和网段是否包含于另一个网段中,如下:
'192.168.1.100' in IP('192.168.1.0/24')TrueIP('192.168.1.0/24') in IP('192.168.1.0/16')True
判断两个网段是否存在重叠,采用IPy提供的overlaps方法,如:
IP('192.168.1.0/23').overlaps('192.168.1.0/24')1 # 代表存在重叠IP('192.168.1.0/24') .overlaps('192.168.2.0')0 # 代表不存在重叠
Original: https://blog.51cto.com/feishujun/5513674
Author: mb62de8abf75c00
Title: Python入门之——IPy模块
相关阅读3
Title: 【2022-06-16】Python解释器的下载安装与使用
一、Python解释器介绍
什么是Python解释器?
Python是一门解释型语言,解释器是Python运行必不可少的一种工具。所以,我们搭建Python环境,本质上就是对Python进行配置和定制。而解释器就是能够执行用其他计算机语言编写的程序的系统软件,它是一种翻译程序。
它的执行方式是一边翻译一边执行,因此其执行效率一般偏低,但是解释器的实现较为简单,而且编写源程序的高级语言可以使用更加灵活和富于表现力的语法。
二、Python解释器下载
-
Python解释器下载官网链接地址:https://www.python.org/downloads/windows/ 使用任意浏览器打开即可
-
进入首页,我们可以很清楚的看到,Python解释器其主要分为两大版本(Python3\Python2),其中Python3最新版本为3.10.5,Python2最新版本为2.7.18,如下图:
- 根据自己的电脑系统选择对应的Python环境,如下图:
- 点击Downloads进入后,下拉列表,找到你所需要的Python解释器版本,点击进行下载,(推荐使用Python3.6)我这里以Python3.6.4版本举例,如下图:
- 如果你是64位操作系统:找到windows x86-64 executable installer 点击下载,如果你是32位操作系统:找到windows x86 executable installer 点击下载
- 补充:查看电脑是64位还是32位的操作系统:鼠标右键点击桌面上—我的电脑——选择属性——查看系统类型,以win10系统为例,如下图:
三、安装教程
- 双击打开应用程序,如下图:
- 我们在这里选择自定义安装,安装路径尽量安装在D盘及其他存储盘内
- 因为C盘是系统盘,建议文件以及软件不要放C盘,否则会影响电脑的性能
- 点击自定义安装,保持默认即可,按next进入下一步,如下图:
- 接下来我们要选择文件所存放的路径,默认路径它会放在C盘,如下图:
- 我这里把它放到了D盘下,并给它新建了一个文件夹名称,如果文件夹名称过长,不容易找到文件所在的位置,如下图:
- 选择D盘,新建一个文件夹,命名举例Python36,如下图:
- 选择存放的路径,就是我们刚刚新建的文件夹路径,点击install开始进行安装,如下图:
- 安装完成,如下图:
四、基础使用
- 接下来,我们就可以进行一些基础的使用了
- 首先,按住键盘的win+R键,我们打开一个cmd命令行窗口,如下图:
- 由于我们的Python解释器是安装在了D盘下的某个文件夹内,所以我们需要在cmd命令行内切换到D盘下后,才能运行程序,所以,我们首先来进行切换动作,如下图:
- 简单的进行一个打印动作,如下图:
五、配置环境变量
- 什么是环境变量?
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。
例如windows操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前下面寻找此程序外,还应到path中指定的路径去找。 用户通过设置环境变量,来更好的运行进程。
- 环境变量的作用?
环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。比如path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。
- 如何配置环境变量?
首先,请大家结合上述话述,简单思考一下,我们如果要配置环境变量的话,那目的是什么?或者说基于Python解释器的启动和运行,我们是否能够通过配置环境变量来满足我的需求呢?比如:切换路径的方法太麻烦了,我想更加简洁方便一点,可以这样做吗?答案是:可以!接下来,我们就开始环境变量的配置,让你不用修改路径,就可以一步到位!!!
- 添加环境变量,在windows操作系统中可以通过鼠标右键依次点击我的电脑-〉系统属性-〉高级系统设置-〉环境变量,来设置系统的环境变量,如下图:
- 选择系统属性——高级——环境变量,如下图:
- 选择系统环境变量PATH——编辑环境变量——新建环境变量,如下图:
- 把文件所在的路径写上去,或者粘贴复制也可以,最后点击确定,如下图:
- 那么,到这一步,我们已经把环境变量配置好了,我们再次打开cmd看看不切换路径,是否能够正常运行Python,来!!!
-
PS:如果打不开或者报错,那就重新开一个cmd窗口,切记不要在原有的cmd窗口进行操作,因为那个窗口是我们配置环境变量之前打开的!!!
-
以上内容,就是关于python解释器的下载与安装,还有一个基本的使用和环境变量的配置
大鹏一日同风起,扶摇直上九万里
假令风歇时下来,犹能簸却沧溟水
——摘自《上李邕》 作者:李白
路漫漫其修远兮,吾将上下而求索
Original: https://www.cnblogs.com/dy12138/p/16383027.html
Author: dy12138
Title: 【2022-06-16】Python解释器的下载安装与使用