python中list 和 dict 效率的一次实践

业务场景:

    有上亿条的数据入库解析并且入库到sqlserver中去,所以每次优化一秒钟,可能对入库的性能就能提升一天。


    python语句的优化,里边有对list数据去重的代码如下:

   

    object_id_set = []
    remove_objects = []
    for object in objects:
        try:
            if object['object_id'] in object_id_set:
                remove_objects.append(object)
            else:
                object_id_set.append(object['object_id'])
        except Exception as e:
            rh_utils.rh_logger.exception('filter object error: {0}, object: {1}'.format(e, object))

    for remove_object in remove_objects:
        objects.remove(remove_object)

修改点就是 把 object_id_set 变成 dict: {}

   

object_id_set = {}
    remove_objects = []
    for object in objects:
        try:
            if object['object_id'] in object_id_set:
                remove_objects.append(object)
            else:
                object_id_set[object['object_id']] = 1
        except Exception as e:
            remove_objects.append(object)
            rh_utils.rh_logger.exception('filter object error: {0}, object: {1}'.format(e, object))

    for remove_object in remove_objects:
        objects.remove(remove_object)

当 过滤的objects的数目达到1万的时候,时间上面方式的时间居然达到了2s,不可接受。改成下面方法之后变成0.1s的样子。

看来对list进行 in 操作应该是遍历了整个 list的复杂度为 O(n), 而dict大概有类似hash的东西保证查询的复杂度为 O(1).



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值