这篇“Python编程的两处陷阱是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python编程的两处陷阱是什么”文章吧。
不可变对象陷阱
思路:生成1百万个随机字符串,分别使用不可对象或可变对象合并字符串,比较花费时间。
生成随机字符串的代码:
import random import timebig = [chr(i) for i in range(65,91)]small = [chr(i) for i in range(97,123)] def randNStr(n): ...: result = [] ...: for i in range(n): ...: strlen = random.randint(3,9) ...: result.append(''.join(random.sample(small+big,strlen))) ...: return result
使用不可变对象方法:combine+s 再赋值给combine,这条语句:因为combine, s都为不可变对象,返回的结果就是新生成一个对象,对象不断堆积。
def immfn(n): ...: combine='' ...: res = randNStr(n) ...: beg = time.time() ...: print('beg time %s'%str(beg)) ...: for s in res: ...: combine = combine + s ...: #print(combine) ...: end = time.time() ...: print('end time %s'%str(end)) ...: print('elispe time: %s'%str(end-beg))
为了避免重复生成新的对象,使用可变对象,文中 Python解惑之对象可变与不可变 提到过,一般可迭代对象,都是可变的。
def mutfn(n): ...: combine='' ...: res = randNStr(n) ...: beg = time.time() ...: print('beg time %s'%str(beg)) ...: combine = ''.join(res) ...: #print('print result:%s'%combine) ...: end = time.time() ...: print('end time %s'%str(end)) ...: print('elispe time: %s'%str(end-beg))
此处使用 str.join(iter),接受可迭代对象,并只返回一个新对象。比较以上两种方法的计算时间,分别从10万,步长10万,终止到100万,比较分析合并字符串的时间。
可以看到可变对象只生成一个新对象的方法,比不可变对象在数据量越大情况下,优势更明显,呈现扩张的喇叭口,当数据为90万时,节省时间成本高达:(0.19-0.025)/0.025 = 6.6 倍。当数据量增长到1千万或更大时,优势更明显。
可变对象陷阱
BAT面试题26:一道Python填空题
题目是这样的:
def f(x,l=[]): ...: for i in range(x): ...: l.append(i*i) ...: print(l) f(2)f(3)结果为: In [2]: f(2) [0, 1]In [3]: f(3) [0, 1, 0, 1, 4]
原因,可变对象作为函数参数,并被设为默认值后,当被再次调用函数后,函数参数原来取值将被再次索引。
为了避免这个问题,可变对象的默认值一般取值为常数:None
def f(x,l=None): ...: if l is None: ...: l = [] ...: for i in range(x): ...: l.append(i*i) ...: print(l) ...:
这样连续被调用时,将会按照预期输出。
以上就是关于“Python编程的两处陷阱是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4585819/blog/4583469