gpt4 book ai didi

python - 从Python中的字典中提取键和值(以线程安全的方式)

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:53 26 4
gpt4 key购买 nike

我有一个简单的函数,用于从字典中提取键和值。

def separate_kv_fast(adict):
'''Separates keys/values from a dictionary to corresponding arrays'''
return adict.keys(), adict.values()

我知道如果在 .keys() 和 .values() 调用之间没有修改字典“adict”,则顺序是可以保证的。我想知道 return 语句是否保证了这一点;基本上,它是线程安全的吗?

下面的“adict”结构对于多线程来说是否更安全或者不需要?

def separate_kv_fast(adict):
'''Separates keys/values from a dictionary to corresponding arrays'''
bdict = dict(adict)
return bdict.keys(), bdict.values()

最佳答案

我一直在学习 python 反汇编,我相信这表明这两个调用不是原子的:

>>> dis.dis(separate_kv_fast)                                                                             
2 0 LOAD_FAST 0 (adict)
3 LOAD_ATTR 0 (keys)
6 CALL_FUNCTION 0
9 LOAD_FAST 0 (adict)
12 LOAD_ATTR 1 (values)
15 CALL_FUNCTION 0
18 BUILD_TUPLE 2
21 RETURN_VALUE
>>>

我相信它跨多个操作码调用键和值表明它不是原子的。

让我们看看您的 bdict = dict(adict) 的效果如何:

  2           0 LOAD_GLOBAL              0 (dict)
3 LOAD_FAST 0 (adict)
6 CALL_FUNCTION 1
9 STORE_FAST 1 (bdict)

LOAD_FASTadict 的引用推送到堆栈上。然后我们用该参数调用 dict 。我们不知道的是 dict() 函数是否是原子的。

bdict = adict.copy() 给出了类似的反汇编。 adict.copy 无法反汇编。

我读到的所有内容都说内部类型是线程安全的。所以我相信对字典的单个函数调用将是内部一致的。即 items()copy()values()keys() 等。两次调用串行(values() 后跟 keys() 不一定安全。迭代器也不是。

您不只使用 items() 有什么原因吗?

我很好奇,所以继续进行基准测试:

#!/usr/bin/python
import timeit
import random

D = dict()
for x in xrange(0, 1000):
D[x] = str(x)

def a():
return D.keys(), D.values()

def b():
keys = []
values = []
for k, v in D.items():
keys.append(k)
values.append(v)
return keys, values

def c():
d = D.copy()
return d.keys(), d.values()

def d():
return zip(*D.items())

print timeit.timeit("a()", 'from __main__ import a')
print timeit.timeit("b()", 'from __main__ import b')
print timeit.timeit("c()", 'from __main__ import c')
print timeit.timeit("d()", 'from __main__ import d')

结果:

6.56165385246
145.151810169
19.9027020931
65.4051799774

该副本是快速原子副本(可能比使用 dict() 稍快)。

关于python - 从Python中的字典中提取键和值(以线程安全的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com