Python字典,列表,生成器

Python笔记

对于编程语言的效率来讲,一般指开发效率和运行效率,不同的语言会有不同的侧重,python语言毫无疑问更在乎编码效率。通过刷题的感觉来讲,不同的case,Python比C++或者C慢了几倍到几十倍。但作为一个程序员,不仅要知其然也要知其所以然。下面罗列一些原因(每一条展开赘述都很深,目前我自己也没有了解清楚):
第一:python是动态语言
一个变量所指向对象的类型在运行时才确定,编译器做不了任何预测,也就无从优化。举一个简单的例子: r = a + b a和b相加,但a和b的类型在运行时才知道,对于加法操作,不同的类型有不同的处理,所以每次运行的时候都会去判断a和b的类型,然后执行对应的操作。而在静态语言如C++或者Java中,编译的时候就确定了运行时的代码。
第二:python是解释执行,但是不支持JIT(后面用Pypy解释器优化会讲到,Pypy就有这种即时编译器的实现)
第三:python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。
第四:python GIL(全局解释器锁)
本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,控制同一时间内共享的数据只能被一个任务修改,保证数据安全。有了GIL的存在,同一时刻同一进程中只有一个线程被执行(无法利用多核),GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理。
第五:垃圾回收(python里每一个东西都是对象,当引用计数为0时,该对象生命就结束了)
引用计数机制的优点:1.简单。2.实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
引用计数机制的缺点:
1.维护引用计数消耗资源
2.循环引用:
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收。


字典与列表

Python 字典中使用了 hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),因此对成员的查找访问等操作字典要比 list 更快。实际操作的时候经常用list = dict.fromkeys(list,True),转成字典后提高查询速度。
2.集合与列表:
如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。set(lista)&set(listb)
所有语言都适用的循环优化:将长度计算提到循环外。
3.字符串的优化:
在字符串连接的使用尽量使用 join() 而不是 +。python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象从而影响性能。
4.使用列表解析和生成器表达式:
一般在刷题时常用列表解析生成列表,但是,受到内存限制,列表容量肯定是有限的,所以大数据量用生成器表达式
列表解析 :expr for iter_var in iterable if cond_expr]
生成器表达式 :(expr for iter_var in iterable if cond_expr)


a,b = b,a # 交换变量
a = 'hello, world!'	a[::-1] # 翻转
a = ['hello', 'world']		 " ".join(a)     # hello world" 拼接字符串
a = [1, 1, 1, 2, 3 ,4 ,4, 5] 	a = list(set(a))        # [1, 2, 3, 4, 5] 列表去重
# 复制列表	
import copy	
a = [1,'a',['x']]
# 浅复制
b = copy.copy(a)
b = a[:]
b = list(a) # 使用工厂函数
# 深复制
b = copy.deepcopy(a)"

ood_list = [i for i in xrange(1,101) if i % 2 == 1] # 列表推导
# 字典推导式 快速更换k,v
mcase = {
    
    'a': 10, 'b': 34}
mcase_frequency = {
    
    v: k for k, v in mcase.items()}
# 读写文件	
with open('/path/to/file', 'r') as f: 
    do something...

猜你喜欢

转载自blog.csdn.net/Pioo_/article/details/107466588