1

假设我们有一个函数想要对 objA 的属性 z 进行一些操作。objA 是 objB 的属性,而 objB 是 objC 等的属性……这两种方法中哪一种更快?有什么区别吗?

方法 1:使用objC.objB.objA.zfor 函数中的每个语句。

方法2:在函数中分配像x这样的局部变量:

x=objC.objB.objA.z

然后对 x 进行操作,然后将输出分配给首选变量。

我知道方法 2 在编写实际代码方面更容易,但不定义新变量会消耗更多内存?哪种方法更 Pythonic,除了上述方法之外,还有其他(更好的)方法吗?

4

2 回答 2

4

方法 2 通常会更快,尽管除非它处于紧密循环中,否则它可能不会有明显的差异。

每次你这样做时a.b.c.d,Python 都必须查找这些属性的值,即使它们在两次使用之间没有变化。如果您x为该值创建一次变量,那么 Python 只需查找一次属性,从而节省时间。

Doingx = a.b.c.d不会创建新对象,因此不会使用任何内存 x将是对指向的同一对象的引用a.b.c.d。但是,正因为如此,您确实需要小心。任何变异的操作x都会影响原始对象。例如,如果a.b.c.d是一个列表,而你这样做x = a.b.c.d,那么x.append(1)将改变原始a.b.c.d对象的值。如果这是你想要的,那就太好了。如果不是,请确保显式复制该值。

于 2013-04-16T05:50:15.253 回答
2

objC.objB.objA.z第二个更pythonic,如果您多次重用它也会更快,因为它避免了每次都必须进行这4次查找。将此值绑定到 的成本并不高x,Python 只是使用对对象的相同引用并且不会复制它。

于 2013-04-16T05:48:03.320 回答