python循环代码优化技巧_记一次优化python循环代码逻辑的过程

问题描述:

一个含有30W元素的列表A,列表的元素都是字符串,现在要循环10W次,每次都要判断一下B字符串是否存在这个A列表里面,有什么优化策略吗?

问题现状:

如果用普通的逻辑来写, 程序会类似下面:

tl = []

for i in range(300000):

tl.append(i)

for j in range(100000):

if k in tl:

print "hit"

如果像上面的写法, 程序性能会随着 10W 这个for循环的增长而几何级下降。

正确的姿势

因为python的list本身是属于不连续的内存, 所以in不停止跳跃各个元素的指针,造成性能的下降。

优化方式1:

list转成dict的key, 然后用dict的in来检查匹配, 这个方式是因为用in去判断dict的keys是否存在,首先dict底层的储存是采用hash储存,in寻找dict的键,本来寻找的对象也是一个生成器,综合这两个因素,所以用这种方式性能会大大提升。

td = dict()

for i in range(300000):

td.setdefault(i, None)

for j in range(100000):

if k in td:

print "hit"

优化方式2:

用numpy的array数据类型,但这个前提是每个元素的数据类型都要一样,不然array会报错。因为array本身是一块连续的大内存,所以循环匹配的时候, 不用跳跃内存寻找,这样也能大大提高性能。

import numpy as np

tl = []

for i in range(300000):

tl.append(i)

tla = np.array(tl)

for j in range(100000):

if k in tla:

print "hit"

至于上面两种方式的性能对比,有兴趣就自己动手试下吧 :)

--EOF--

发表于 2019-03-06 08:51:00,并被添加「python」标签。

本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »

提醒:本文最后更新于 646 天前,文中所描述的信息可能已发生改变,请谨慎使用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值