1. Python 的 yield 关键字有什么作用?
保存当前运行状态,然后暂停执行,即将函数挂起。yield关键字后面表达式的值作为返回值返回。当使用next()、send()函数从断点处继续执行
2. Python中【args】【kwargs】 是什么?
- 可变参数的处理
- args 打包成 tuple
- kwargs 被打包成 dict
3. 并发与并行的区别?
并发不是并行,但看起来像是同时运行的,单个cpu和多道技术就可以实现并发。并行也属于并发,指的是同时运行,只有具备多个cpu才能实现并行
4. 下面代码会输出什么?
list = ['1','2','3','4','5']
print(list[10:])
'''
这是一个坑!很e心的操作,代码将输出[], 它并不会产生我们脑海中预期的IndexError错误
'''
5. 处理一个大小为8G的文件,但是内存只有4G!如何实现以及需要考虑的问题?
方法一:
可以通过生成器,分多次读取,每次读取数量相对少的数据(比如500MB)进行处理,处理结束后在读取后面的 500MB的数据。
方法二:
可以通过linux命令split切割成小文件,然后再对数据进行处理,此方法效率比较高。可以按照行数切割,可以按照文件大小切割
from mmap import mmap
def get_lines(f_p):
with open(f_p,"r+") as f:
m = mmap(f.fileno(), 0)
tmp = 0
for i, char in enumerate(m):
if char==b"\n":
yield m[tmp:i+1].decode()
tmp = i+1
if __name__=="__main__":
for i in get_lines("file/path"):
print(i)
内存只有4G无法一次性读入8G文件,需要分批读入数据且记录每次读入数据的位置。分批每次读取数据的大小,太小的话会在读取操作花费过多时间
6. 请按value值进行排序: d= {‘a’:30,‘g’:50,‘i’:12,‘k’:23}
sorted(d.items(), key=lambda x:x[1])
7. 介绍一下进程同步锁的概念
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件或者打印终端是可以的。共享带来了竞争,竞争的结果就是混乱。解决办法就是加锁处理。加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全
8. python是如何进行内存管理的?
python采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值,多个变量指向同一块内存地址
9. Python中的深拷贝和浅拷贝有什么区别?
copy.copy(浅拷贝): 只拷贝父对象,不会拷贝对象的内部的子对象
copy.deepcopy( 深拷贝): 拷贝对象及其子对象
10. Python垃圾回收机制
- PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。引用计数为0时,该对象生命结束了
- 优点:【简单、实时性】
- 缺点:【维护引用计数消耗资源、循环引用】
- 【
标记-清除机制
】基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放- 【
分代技术
】分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量