python dict字典 items()和iteritems()多线程遍历

本文探讨了Python字典的items()和iteritems()的区别,强调了iteritems()在遍历速度上的优势。在多线程环境下,使用items()遍历字典不会引发异常,而iteritems()可能会导致线程安全问题,例如抛出异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

items()和iteritems()区别:
一、两个函数的作用
字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。

字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。
所以iteritems遍历的速度比items方法快

python dict字典循环遍历性能 iteritems比items快

 

二、使用items()和iteritems()遍历字典,并使用多线程进行读写,用下面的代码进行测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import traceback
import threading
from time import sleep,ctime

_data = dict()

def loop(nloop,data):
    res = dict()
    for i in xrange(nloop):
        try:
            for k, v in data.iteritems():
            # for k, v in data.items():
                a = k
                b = v
                res[a] = b
        except Exception as e:
            print("read occur exception:{} i:{} {} {}".format(
                traceback.format_exc(), i, k, v))
            continue

def loop2(nloop,data):
    for i in xrange(nloop):
        try:
            for x in xrange(i * 5):
                data[x] = x * i

        except Exception as e:
            print("write occur exception:{} i:{} x:{}".format(
               traceback.format_exc(), i, x))
            continue


def main():
    print('main begin: ',ctime())
    threads=[]

    for i in xrange(1):
        t2=threading.Thread(target=loop2,args=(5000, _data)) 
        threads.append(t2)

        t1=threading.Thread(target=loop,args=(10000, _data)) 
        threads.append(t1)

    for i in xrange(len(threads)):
        threads[i].start()  #循环 开始线程

    for i in xrange(len(threads)):
        threads[i].join()   #循环 join()方法可以让主线程等待所有的线程都执行完毕。

    print('main end ',ctime())

if __name__=='__main__':
    main()

当读线程使用items()进行遍历,没有抛出异常,

但使用iteritems()进行遍历时,会抛出下述异常:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值