Python循环的性能优化

背景是scz讨论“两个等长list之间的merge(paste)操作”引发对python循环的性能讨论(scz的FAQ引用附后)。

从中学到两点:

(1)用xrange()比用range()性能好

(2)len()放在循环外比放在循环内性能好

(3)引申一下,xrange(len())放在循环外比放在循环内性能好

 

------------------------

引自:scz的FAQ

26.5 两个等长list之间的merge(paste)操作

Q:

Unix有个paste命令,可以合并两个行数相等的文本文件。现有两个list:

x=['a','b','c']
y=['d','e','f']

我想得到新list:

['ad','be','cf']

但我不想用for循环:

x   = ['a','b','c']
y   = ['d','e','f']
n   = len( x )
ret = []
for i in range( n ) :
    ret.append( x[i] + y[i] )

print ret

A: scz@nsfocus 2011-12-27 12:46

可以用高序函数:

map((lambda x,y:x+y),x,y)

A: lotrpy@weibo 2011-12-27 19:07

[''.join(z) for z in zip(x,y)]

效率比map()低:

python -m timeit -s "x=['a','b','c'];y=['d','e','f']" "map((lambda x,y:x+y),x,y)"

100000 loops, best of 3: 2.1 usec per loop

python -m timeit -s "x=['a','b','c'];y=['d','e','f']" "[''.join(z) for z in zip(x,y)]"

100000 loops, best of 3: 2.24 usec per loop

A: hume 2011-12-28 18:41

[v+y[i] for i,v in enumerate(x)]

这个效率比前面的都高:

python -m timeit -s "x=['a','b','c'];y=['d','e','f']" "[v+y[i] for i,v in enumerate(x)]"

1000000 loops, best of 3: 1.55 usec per loop

A: lzx@nsfocus 2012-01-05 18:30

[x[i]+y[i] for i in range(len(x))]

这个和用enumerate效率差不多,不过这个似乎更容易想到一些。

python -m timeit -s "x=['a','b','c'];y=['d','e','f']" "[x[i]+y[i] for i in range(len(x))]"

1000000 loops, best of 3: 1.58 usec per loop

A: zyh@nsfocus 2012-01-06 18:44

[i+j for i,j in zip(x,y)]

python -m timeit -s "x=['a','b','c'];y=['d','e','f']" "[i+j for i,j in zip(x,y)]"

1000000 loops, best of 3: 1.94 usec per loop

A: 请叫我李牛牛@weibo 2012-01-06 22:37

python -m timeit -s "x=['a','b','c'];y=['d','e','f'];L=len(x)" "[x[i]+y[i] for i in xrange(L)]"

1000000 loops, best of 3: 1.22 usec per loop


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值