目录
3)python strip() 函数和 split() 函数的详解及实例
三.tensorflow中使用指定的GPU及GPU显存 CUDA_VISIBLE_DEVICES
一.Jupyter Notebook快速上手指南
1).Jupyter计时
对于计时有两个十分有用的魔法命令:%%time 和 %timeit. 如果你有些代码运行地十分缓慢,而你想确定是否问题出在这里,这两个命令将会非常方便。
1.%%time 将会给出cell的代码运行一次所花费的时间。
%%time
import time
for _ in range(1000):
time.sleep(0.01)# sleep for 0.01 seconds
output:
CPU times: user 196 ms, sys: 21.4 ms, total: 217 ms
Wall time: 11.6 s
2.%time 将会给出当前行的代码运行一次所花费的时间。
import numpy
%time numpy.random.normal(size=1000)
output:
Wall time: 1e+03 µs
3.直接计时作差
import time
st1 = time.time()
要测运行时间的代码
st2 = time.time()
print('所用时间:',st2-st1)
4.%timeit 使用Python的timeit模块,它将会执行一个语句100,000次(默认情况下),然后给出运行最快3次的平均值。
import numpy
%timeit numpy.random.normal(size=100)
output:
12.8 µs ± 1.25 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2).在jupyter中使用终端命令
只需在命令前加个感叹号
该命令用于列出所有可用的 NVIDIA 设备信息。
GPU状态监测 nvidia-smi 命令详解
在进行深度学习实验时,GPU 的实时状态监测十分有必要。今天详细解读一下 nvidia-smi 命令。
这里写图片描述
上图是服务器上 GeForce GTX 1080 Ti 的信息,下面一一解读参数。
上面的表格中的红框中的信息与下面的四个框的信息是一一对应的:
GPU:GPU 编号;
Name:GPU 型号;
Persistence-M:持续模式的状态。持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态;
Fan:风扇转速,从0到100%之间变动;
Temp:温度,单位是摄氏度;
Perf:性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能(即 GPU 未工作时为P0,达到最大工作限度时为P12)。
Pwr:Usage/Cap:能耗;
Memory Usage:显存使用率;
Bus-Id:涉及GPU总线的东西,domain:bus:device.function;
Disp.A:Display Active,表示GPU的显示是否初始化;
Volatile GPU-Util:浮动的GPU利用率;
Uncorr. ECC:Error Correcting Code,错误检查与纠正;
Compute M:compute mode,计算模式。
下方的 Processes 表示每个进程对 GPU 的显存使用率。
二.python基础
1)format 格式化函数
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
实例
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
也可以设置参数:
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
输出结果为:
网站名:菜鸟教程, 地址 www.runoob.com
网站名:菜鸟教程, 地址 www.runoob.com
网站名:菜鸟教程, 地址 www.runoob.com
也可以向 str.format() 传入对象:
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class AssignValue(object):
def __init__(self, value):
self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
输出结果为:
value 为: 6
2)matplotlib中使用subplots
fig,ax = plt.subplots()的意思是,建立一个fig对象,建立一个axis对象,相当于:
fig=plt.figure() #画布
ax=fig.add_subplot(221) #将画布分成2*2四份,ax在第一个位置
3)python strip() 函数和 split() 函数的详解及实例
一直以来都分不清楚strip和split的功能,实际上strip是删除的意思;而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。下面就详细说一下这两个功能,
1 Python strip()函数 介绍
函数原型
声明:s为字符串,rm为要删除的字符序列
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
注意:
(1)当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
(2)这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
例如,
>>> a = ' 123'
>>> a
' 123'
>>> a.strip()
'123'
(2)这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
例如,
>>> a = '123abc'
>>> a.strip('21')
'3abc'
>>> a.strip('12')
'3abc'
结果是一样的。
2 python split()函数 介绍
说明:
Python中没有字符类型的说法,只有字符串,这里所说的字符就是只包含一个字符的字符串!!!
这里这样写的原因只是为了方便理解,仅此而已。
(1)按某一个字符分割,如‘.'
>>> str = ('www.google.com')
>>> print str
www.google.com
>>> str_split = str.split('.')
>>> print str_split
['www', 'google', 'com']
(2)按某一个字符分割,且分割n次。如按‘.'分割1次
>>> str_split = str.split('.',1)
>>> print str_split
['www', 'google.com']
(3)split()函数后面还可以加正则表达式,例如:
>>> str_split = str.split('.')[0]
>>> print str_split
www
负数索引
split分隔后是一个列表,[0]表示取其第一个元素;负数索引如[-1]表示从右往左数第一个元素
>>> str_split = str.split('.')[::-1]
>>> print str_split
['com', 'google', 'www']
>>> str_split = str.split('.')[::]
>>> print str_split
['www', 'google', 'com']
PS:- 对R来说,负数索引表示在原有的列表中去除该索引对应的元素,如list[-1]就是在原有的列表中去除第1个元素,所以结果是 list1[-1] = [b, c, d, e](R中列表元素序号从1开始)
> list1 <- c("a", "b", "c", "d", "e")
> list1[-1]
[1] "b" "c" "d" "e"
按反序列排列,[::]安正序排列
>>> str = str + '.com.cn'
>>> str
'www.google.com.com.cn'
>>> str_split = str.split('.')[::-1]
>>> print str_split
['cn', 'com', 'com', 'google', 'www']
>>> str_split = str.split('.')[:-1]
>>> print str_split
['www', 'google', 'com', 'com']
从首个元素开始到次末尾,最后一个元素删除掉。
split()函数典型应用之一,ip数字互换:
# ip ==> 数字
>>> ip2num = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
>>> ip2num('192.168.0.1')
3232235521
# 数字 ==> ip # 数字范围[0, 255^4]
>>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
>>> num2ip(3232235521)
'192.168.0.1'
最后,python怎样将一个整数与IP地址相互转换?
>>> import socket
>>> import struct
>>> int_ip = 123456789
>>> socket.inet_ntoa(struct.pack(‘I',socket.htonl(int_ip)))#整数转换为ip地址
‘7.91.205.21'
>>> str(socket.ntohl(struct.unpack(“I”,socket.inet_aton(“255.255.255.255″))[0]))#ip地址转换为整数
‘4294967295'
4)生成器generator
它就是个迭代器(一个可迭代的量,列表元组等都是迭代器),在函数里只要有一个yield这个函数就变成生成器,通常这个函数里会有循环,运行到yield会停止并对保持yield后面的量,并将这个量存入迭代器,就像数字存入列表,之后只要迭代这个函数就能取出它里面的元素。
5)Python 中同一个类两个函数间变量的调用方法
class A():
def test_a(self):
self.m ="hello"
def test_b(self):
self.test_a()
n=self.m + "world"
print(n)
if __name__ == '__main__':
A().test_b()
如果是构造函数里的参数可以直接用
6)zip
描述
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。
如果需要了解 Pyhton3 的应用,可以参考 Python3 zip()。
语法
zip 语法:
zip([iterable, ...])
参数说明:
- iterabl -- 一个或多个迭代器;
返回值
返回元组列表。
实例
以下实例展示了 zip 的使用方法:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
7)实现python代码的整体缩进,退格,注释
-
缩进 :Tab键
-
退格 :Shift + Tab键
-
注释:ctrl + /
8)关于jupyter notebook中无法使用cv2.imshow的解决方式
问题:
jupyter notebook 上,在使用 opencv 的时候,发现最基本的图片显示会出现问题,即,当使用 cv2.imshow() 的时候,会导致
OpenCV Error:Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvShowImage, file /feedstock_root/build_artefacts/opencv_1496434080029/work/opencv-3.2.0/modules/highgui/src/window.cpp, line 583 Traceback (most recent call last):File "<stdin>", line 1, in <module> cv2.error:/feedstock_root/build_artefacts/opencv_1496434080029/work/opencv-3.2.0/modules/highgui/src/window.cpp:583: error: (-2) The function is not implemented.
Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvShowImage.
在ubutnu系统下,应该是缺少libgtk2.0-dev 和 pkg-config,
解决方法,
第一步,通过 apt-cache 检查默认存储库中是否有自己需要的包,例如,使用 apt-cache search libgtk2.0-dev,没有的话,可以先使用 sudo apt-get update来更新库包,再进行检查,一般更新后都能找到。
第二步,使用 sudo apt install ibgtk2.0-dev pkg-config 安装缺少的包。
如果还不能解决问题的话,可以用 matplotlib.pyplot.imshow() 暂时替代图片显示函数。
9)Python类中self的作用
举例如下:
class Person:
def setName(self,name):
self.name = name
self.inputname = name
input1 = name
def getName(self):
return self.name
def greet(self):
print "Hello world! I'm %s ." % self.name
其中,self是对于对象自身的引用。
我们对比 self.inputname
和 input1
这两个变量,都赋值为 name
,那么这两个值有什么区别呢?
在这里,self 改变了变量的作用域。
不加 self 的变量是局部变量,作用域是当前函数;加了 self 的变量是实例变量,作用域是当前实例。
也就是,我们在外部将类 Person 实例化时,可以调用它的 inputname 变量,因为这个变量是实例变量,作用域当前实例,却调用不了 input1 变量,因为这个变量是局部变量,只能在setName 函数中使用。
self 是什么对象?
我们这里假设 lil = Person(),其中 lil 是 Person 类的一个实例。
当我们调用 lil 的 setName 和 getName 或 greet 方法时,lil 自动将自己作为第一个参数,传入函数中,因此形象的称为 self
所以 self 是一个实例,指的实例本身。
通过使用 self,我们可以在其成员方法中访问他们要对其特性进行操作的对象本身了。
换句话说
这样说很拗口,换句话说,我们通过使用 self,将 attribute 的作用域从当前函数 变成 当前实例,这样这个 attribute 就可以在整个实例中都有效。这样便于我们在不同的成员方法中对这个 attribute 进行操作。例如上面例子中的 self.name ,因为使用了 self,我们在 getName 和 greet 中均可以使用该实例变量。
而且,对于实例 lil,我们也可以直接调用 name 这个attribute,也就是 lil.name
,是有效的。但是 lil.input1
是无效的,会提示“类里面没有这个属性”。
三.tensorflow中使用指定的GPU及GPU显存 CUDA_VISIBLE_DEVICES
参考: https://blog.youkuaiyun.com/jyli2_11/article/details/73331126
https://blog.youkuaiyun.com/cfarmerreally/article/details/80321276
http://www.cnblogs.com/darkknightzh/p/6591923.html
场景:
有一台服务器,服务器上有多块儿GPU可以供使用,但此时只希望使用第2块和第4块GPU,但是我们希望代码能看到的仍然是有两块GPU,分别编号为0,1,这个时候我们可以使用环境变量CUDA_VISIBLE_DEVICES来解决这个问题。
比如:
CUDA_VISIBLE_DEVICES=1 只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块儿GPU
CUDA_VISIBLE_DEVICES=0,2,3 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块儿,gpu[1]指的是第2块儿,gpu[2]指的是第3块儿
CUDA_VISIBLE_DEVICES=2,0,3 只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块儿,gpu[1]指的是第0块儿,gpu[2]指的是第3块儿
设置示例: 在python程序中,
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
查看自己用的几号gpu:
echo $CUDA_VISIBLE_DEVICES
kill进程:
用nvidia-sim查看够号对应的PID号,比如我用0号gpu要kill掉16439和16619
kiil -9 -16439