温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python编程的两处陷阱是什么

发布时间:2022-01-13 15:09:36 来源:亿速云 阅读:116 作者:iii 栏目:大数据

这篇“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万,比较分析合并字符串的时间。

Python编程的两处陷阱是什么

可以看到可变对象只生成一个新对象的方法,比不可变对象在数据量越大情况下,优势更明显,呈现扩张的喇叭口,当数据为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编程的两处陷阱是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI