你还不使用 += 吗?

python里面有普通的+,有operator里面的add方法表示加,还有a += 1,a = a + 1的形式,那么他们有什么区别呢???先看一组测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import operator
from copy import deepcopy
import time
import sys

a = list(range(10000))

def tryit(x):
	def decorator(func):
		def wrapper(*args,**kwargs):
			start2 = time.clock()
			result2 = []
			for i in x:
				result2 += [i]
			end2 = time.clock()
			print('+=用了{}'.format((end2-start2)*10000))
			return func(*args,**kwargs)
		return wrapper
	return decorator

@tryit(a)
def compare(x):
	start1 = time.clock()
	result1 = []
	for i in x:
		result1 = result1 + [i]
	end1 = time.clock()
	print('普通+用了{}'.format((end1-start1)*10000))
	start3 = time.clock()
	result3 = []
	for i in x:	
		result3 = operator.add(result3,[i])
	end3 = time.clock()
	print('operator的add方法用了{}'.format((end3-start3)*10000))
	
compare(a)
sys.exit('比较一下~')

结果:

+=用了4.888888888888889
普通+用了1078.351111111111
operator的add方法用了1096.5688888888888
比较一下~

这。。。什么情况,+= 居然这么快???
下面来探一下究竟
启动IDLE

>>> alist = [1,2,3,4]
>>> id(alist)
2503055438344
>>> alist = alist + [5]
>>> id(alist)
2503055371144
>>> blist = [1,2,3,6]
>>> id(blist)
2503055589576
>>> blist += [8]
>>> id(blist)
2503055589576

alist的id变了,blist的id没变???纳尼???

思考:
可以发现,如果是使用a = a + 1的形式,a指向了别的的对象,地址发生了变化,即发生了对象的重新引用,而使用a += 1的形式,是对这个对象的原地操作,a指向的还是原来那个对象。引用的值所在的内存没有发生变化(地址没变)所以用 += 的时间才和另一种方式的时间花耗差这么远。经过此处的例子,对python的内存管理机制又有新的了解了~~~

所以养成良好的习惯,使用 += 吧!!!==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值