python的**变形效率

Kaz*_*azz 1 python dictionary kwargs python-3.x avro

这样构建python3流可以吗?

def foo(**kwargs):
    kwargs['kw'] = 1
    return bar(**kwargs, wk=2)
def bar(**kwargs):
    process(1,2,'sss',**kwargs)
    for i in kwargs:
        print(i)
...etc...
Run Code Online (Sandbox Code Playgroud)

kwarg是要转到单个可变对象(dict),并且仅将其引用沿流传递,还是将我解压缩并一遍又一遍地创建?

更精确的问题。如果我这样做:

def a(**kwargs):
    return b(**kwargs)
def b(**kwargs):
    return c(**kwargs)
...
def z(**kwargs):
    print(**kwargs)
Run Code Online (Sandbox Code Playgroud)

一次只能有1个字典吗?如果是这样,每次调用都会创建一个新对象吗?还是我将它们堆叠?

实际情况是,我是与AVRO通信的子服务之一。因此,我有一个将二进制文件转换为的软件包dict,然后我需要做一些事情并创建一个新的AVRO。

有些字段在新架构中不存在,有些字段已添加,有些字段只是传递而未触及它们。

因此,我只是接受了第一个字典,一遍又一遍地传递它,添加了越来越多的数据,最后我有了另一个架构,而avro包可以接受如此巨大的字典,并且仅序列化架构中定义的内容。

这样可以吗?

Mar*_*ers 5

将为每个**kwargs函数中的每个参数构建一个新的字典。这是因为调用 **kwargs语法与函数签名中的语法不同

  • 使用**kwargsin call会使字典解压缩成单独的关键字参数。
  • 使用**kwargs作为捕获所有参数导致要字典产生从在被传递关键字参数。

即使不是这种情况,Python也无法通过共享字典进行优化。函数foo()调用bar()必须处理kwargs传递给调用的字典可能发生突变的可能性。

因此,不,**kwargs在一系列连接的函数中使用不会提高效率。

一个快速演示演示了传递给一系列功能的词典的独特之处:

>>> def a(**kwargs):
...     print('a', id(kwargs))
...     b(**kwargs)
...
>>> def b(**kwargs):
...     print('b', id(kwargs))
...
>>> a(foo='bar')
a 4556474552
b 4557517304
Run Code Online (Sandbox Code Playgroud)

如果词典是共享的,它们的id()价值也将相同。

如果要在函数之间传递共享状态,请显式进行。直接传递字典,例如:

def foo(**state):
    state['kw'] = 1
    state['wk'] = 2
    return bar(state)  # kwargs passed in as a single argument

def bar(state):
    # etc.
Run Code Online (Sandbox Code Playgroud)