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的内存管理机制又有新的了解了~~~
所以养成良好的习惯,使用 += 吧!!!==