Python GIL锁

Python50

什么是GIL锁

GIL,是最流行在 Python 解释器 CPython 中的一个技术术语。它的意思是全局解释器锁,本质上是类似操作系统的 Mutex。每一个 Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。

CPython会轮流执行 Python 线程。这样一来,用户就会看到线程交替执行,似乎是并行,但是其实只有一个线程在运行。现在都是多核CPU,可以实现线程的并行运行,所以Python中并不是和使用多线程。

GIL如何工作

下面这张图,就是一个 GIL 在 Python 程序的工作示例。其中,Thread 1、2、3 轮流执行,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行;同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源。

Python 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地址

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文件,这里可以参考我写的(需要留言,比较懒)

已更新:nnUNet使用指南(四):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文件夹
Python GIL锁
不起作用,修改这里:
Python GIL锁

手动选择预测模型

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'

Python GIL锁

多网络计算方法详解

有时候我们想比较两个网段是否存在包含、重叠等等关系,比如同网络但不同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 # 代表不存在重叠

Python GIL锁

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 GIL锁

  • 根据自己的电脑系统选择对应的Python环境,如下图:

Python GIL锁

  • 点击Downloads进入后,下拉列表,找到你所需要的Python解释器版本,点击进行下载,(推荐使用Python3.6)我这里以Python3.6.4版本举例,如下图:

Python GIL锁

  • 如果你是64位操作系统:找到windows x86-64 executable installer 点击下载,如果你是32位操作系统:找到windows x86 executable installer 点击下载

Python GIL锁

  • 补充:查看电脑是64位还是32位的操作系统:鼠标右键点击桌面上—我的电脑——选择属性——查看系统类型,以win10系统为例,如下图:

Python GIL锁

Python GIL锁

三、安装教程

  • 双击打开应用程序,如下图:

Python GIL锁

  • 我们在这里选择自定义安装,安装路径尽量安装在D盘及其他存储盘内
  • 因为C盘是系统盘,建议文件以及软件不要放C盘,否则会影响电脑的性能
  • 点击自定义安装,保持默认即可,按next进入下一步,如下图:

Python GIL锁

  • 接下来我们要选择文件所存放的路径,默认路径它会放在C盘,如下图:

Python GIL锁

  • 我这里把它放到了D盘下,并给它新建了一个文件夹名称,如果文件夹名称过长,不容易找到文件所在的位置,如下图:

Python GIL锁

  • 选择D盘,新建一个文件夹,命名举例Python36,如下图:

Python GIL锁

  • 选择存放的路径,就是我们刚刚新建的文件夹路径,点击install开始进行安装,如下图:

Python GIL锁

  • 安装完成,如下图:

Python GIL锁

四、基础使用

  • 接下来,我们就可以进行一些基础的使用了
  • 首先,按住键盘的win+R键,我们打开一个cmd命令行窗口,如下图:

Python GIL锁

Python GIL锁

  • 由于我们的Python解释器是安装在了D盘下的某个文件夹内,所以我们需要在cmd命令行内切换到D盘下后,才能运行程序,所以,我们首先来进行切换动作,如下图:

Python GIL锁

  • 简单的进行一个打印动作,如下图:

Python GIL锁

五、配置环境变量

  • 什么是环境变量?

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。

例如windows操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前下面寻找此程序外,还应到path中指定的路径去找。 用户通过设置环境变量,来更好的运行进程。

  • 环境变量的作用?

环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。比如path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。

  • 如何配置环境变量?

首先,请大家结合上述话述,简单思考一下,我们如果要配置环境变量的话,那目的是什么?或者说基于Python解释器的启动和运行,我们是否能够通过配置环境变量来满足我的需求呢?比如:切换路径的方法太麻烦了,我想更加简洁方便一点,可以这样做吗?答案是:可以!接下来,我们就开始环境变量的配置,让你不用修改路径,就可以一步到位!!!

  • 添加环境变量,在windows操作系统中可以通过鼠标右键依次点击我的电脑-〉系统属性-〉高级系统设置-〉环境变量,来设置系统的环境变量,如下图:

Python GIL锁

  • 选择系统属性——高级——环境变量,如下图:

Python GIL锁

  • 选择系统环境变量PATH——编辑环境变量——新建环境变量,如下图:

Python GIL锁

  • 把文件所在的路径写上去,或者粘贴复制也可以,最后点击确定,如下图:

Python GIL锁

Python GIL锁

  • 那么,到这一步,我们已经把环境变量配置好了,我们再次打开cmd看看不切换路径,是否能够正常运行Python,来!!!

Python GIL锁

  • PS:如果打不开或者报错,那就重新开一个cmd窗口,切记不要在原有的cmd窗口进行操作,因为那个窗口是我们配置环境变量之前打开的!!!

  • 以上内容,就是关于python解释器的下载与安装,还有一个基本的使用和环境变量的配置

大鹏一日同风起,扶摇直上九万里

假令风歇时下来,犹能簸却沧溟水

——摘自《上李邕》 作者:李白

路漫漫其修远兮,吾将上下而求索

Original: https://www.cnblogs.com/dy12138/p/16383027.html
Author: dy12138
Title: 【2022-06-16】Python解释器的下载安装与使用