2016-06-14 54 views
0

假设我有一个返回多个元素一个Python函数,例如myfoo0()Python列表解包,这是昂贵的吗?它效率低下吗?

def myfoo0(): 
    return([1, 2, 3]) 

,而这被用作:

fit = myfoo0(); 

现在,考虑使用一些fit条目的功能作为输入。例如:

def myfoo1(fit): 
    [a, b, c] = fit 
    return(doSomething(a)) 

现在,我觉得更容易阅读的打算,如果我写为:

fit = myfoo0(); 
out = myfoo1(fit) 

(一个例子是,当我有很多的功能myfoo1,...,myfoon各使用的fit 我的问题是如何做上面的代码(具有myfoo1体内的的fit条目的命名)进行比较(从性能角度)到这一个不同的组件):

[a, b, c] = myfoo0(); 
out = myfoo2(a) 

其中

def myfoo2(a): 
    return(doSomething(a)) 

特别地,是与元组在函数内部拆包溶液招致显著额外费用(例如,在复制方面)?

+3

你并没有在任何地方制作深层拷贝。这里的任何副本都很浅。但在这种情况下,这是一个有争议的问题,因为你永远不会有多于一层的列表(或其他对象)嵌套,在这种情况下,深度和浅度副本是等价的。如果您有一个列表清单,并且这两个级别的所有列表都被复制,则可以使用深层复制的示例。浅拷贝只会复制顶层列表,并且共享嵌套列表。 –

+1

这是一样的。 – BadZen

+0

好的,删除了我所误解的深层副本的含义。我的问题是:第一个构造效率低下 - 我为(IMHO)增加了清晰度而招致成本? – user189035

回答

2

有一些误解的位置:

  1. fit = myfoo0();不会复制任何东西。 fit仅仅是对myfoo0()返回的列表的引用,而不是副本。

  2. [a, b, c] = myfoo0();也不会创建新列表。另一方面,你有3个变量分别是第一,第二和第三个列表成员的引用。

  3. out = myfoo1(fit)是不一样的myfoo1(a)。第一个调用调用myfoo1,第一个参数作为第一个参数传递,第二个调用调用myfoo1,第一个列表成员作为第一个参数传递。

+0

对不起,请看看编辑过的问题:阅读你的答案我意识到在不幸的编辑过程中,我意外地删除了部分问题〜 – user189035

+3

@ user189035对不起,你在当前状态下的问题很混乱。你为什么期望这两个片段的表现不同?除非你假设全局变量访问时间与局部变量访问时间不同(可能是这种情况),否则它们是完全一样的,这就是这种情况。即便如此,我们正在谈论这样一个无限小的差异,除非这是您最耗时的算法中最关键的部分,否则您甚至无法衡量显着的差异。谈论过早的优化... –

+0

@Sebastien Hoffmann:您在评论中回答了我的问题“两种语法在性能方面的差异可以忽略不计” – user189035

相关问题