内存管理 psutil psutil.virtual_memory()
可以查看本机的内存使用,其中total
表示总的物理内存,available
表示可以立即分配给进程而无需系统进入交换的内存。(但我认为他讲的也没有特别清楚,比如available
与free
之间的关系)
具体实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import psutilimport osif __name__ == '__main__' : mem = psutil.virtual_memory() zj = float (mem.total) / 1024 / 1024 / 1024 ysy = float (mem.used) / 1024 / 1024 / 1024 kx = float (mem.available) / 1024 / 1024 / 1024 print ('系统总计内存:%.4fGB' % zj) print ('系统已经使用内存:%.4fGB' % ysy) print ('系统空闲内存:%.4fGB' % kx) print (u'当前进程的内存使用:%.4f GB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024 / 1024 )) print (u'cpu个数:' , psutil.cpu_count())
运行结果:
1 2 3 4 5 系统总计内存:11.7141GB 系统已经使用内存:4.1249GB 系统空闲内存:7.0015GB 当前进程的内存使用:0.0112 GB cpu个数: 6
memory_profile 除此之外python查看内存还可以通过memory_profiler,在测试函数前加上@profile
,在运行代码时加上-m memory_profiler
就可以了解函数每一步代码的内存占用。
guppy 如果我们关注对象的内存占用,可以使用guppy。guppy直接打印出对应各种python类型(list、tuple、dict等)分别创建了多少对象,占用了多少内存。
具体实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 from guppy import hpyimport randomdef my_func (): result = [] def _get (): return chr (random.randint(0 ,100 )) for i in range (10 ): mk = [_get() for i in range (10 )] result.extend(mk) return "" .join(result) if __name__ == '__main__' : profile = hpy() print (profile.iso(my_func()))
参考文章:
https://psutil.readthedocs.io/en/latest/
https://blog.csdn.net/zhou_xiong1130/article/details/108990167
读取文件 在python读取文件一般采用下述代码
1 2 3 with open (fname, 'r' , encoding='utf-8' ) as f: lines = f.readlines() line = f.readline()
f
其实是文件指针位置,一个文件只有一个指针,readlines
是将文件从指针位置读到结尾,读完后指针在结尾,此时再使用readline
就没有东西可以读了。此时,我们可以使用seek
来帮助文件指针移动到指定位置。
以读取文件首行和尾行的代码为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 fname = 'test.txt' with open (fname, 'r' , encoding='utf-8' ) as f: lines = f.readlines() first_line = lines[0 ] last_line = lines[-1 ] print ('文件' + fname + '第一行为:' + first_line) print ('文件' + fname + '最后一行为:' + last_line) with open (fname, 'rb' ) as f: first_line = f.readline() offset = -50 while True : """ file.seek(off, whence=0):从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动。 如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。 """ f.seek(offset, 2 ) lines = f.readlines() if len (lines) >= 2 : last_line = lines[-1 ] break offset *= 2 print ('文件' + fname + '第一行为:' + first_line.decode()) print ('文件' + fname + '最后一行为:' + last_line.decode())
参考文章:
https://zhuanlan.zhihu.com/p/98007747