问题描述:
一个含有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 天前,文中所描述的信息可能已发生改变,请谨慎使用。