这篇“Python编程的两处陷阱是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python编程的两处陷阱是什么”文章吧。
不可变对象陷阱
思路:生成1百万个随机字符串,分别使用不可对象或可变对象合并字符串,比较花费时间。
生成随机字符串的代码:
import random
import time
big = [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编程的两处陷阱是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。