欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你还不使用 += 吗?

程序员文章站 2022-06-10 08:57:31
...

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的内存管理机制又有新的了解了~~~

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

相关标签: +=和+的区别