2016-01-25 92 views
1

可以有任何的問題,可能會出現直接使用上創建實例類的方法一樣,?:實例化python類而不將實例分配給變量是否正常?

TmpClass('lol').printx() 

參考類的例子:

class TmpClass: 
     def __init__(self, x): 
      self.x = x 

     def printx(self): 
      print self.x 
+1

爲什麼不,如果那是你打算做的?如果你以後不打算使用這個實例,那你爲什麼要把它分配給一個變量?我甚至會說將它分配給一個變量將會被誤導,任何下降IDE都會將該變量突出顯示爲未使用。 –

+0

避免使用類似res = TmpClass('lol')。printx()的東西。 'lol'將被打印,但res將是None。 – Farseer

+0

@Eli Korvigo,我是python新手,但努力改進。來自C,我謹慎對待所有對我而言並不直觀的東西。在這種情況下,我無法自己在網上找到信息。 – user1308345

回答

0

例如,如果你在循環中做MyClass('a').my_method()那樣,你會給垃圾回收器做很多工作。

下面是一個使用IPython的一個例子conslole

In [11]: class Asdf(object): 
    ....:  def __init__(self, x): 
    ....:   self.x = x 
    ....:  def printx(self): 
    ....:   pass 
    ....:  

In [12]: def asdf(x): 
    ....:  pass 
    ....: 

In [13]: %timeit Asdf(9).printx() 
The slowest run took 14.89 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 272 ns per loop 

In [14]: %timeit asdf(9) 
10000000 loops, best of 3: 56.9 ns per loop 

正如你所看到的,它需要大量的時間來實例化和清理創建的對象,這一比例僅爲調用一個函數。現在在某些情況下調用一個函數是不夠的。但這些僅僅是我的2美分,特別是性能問題

值得注意的是:我從函數/方法中排除了打印。如果我將打印放入,則結果看起來非常不同:

對於類實例化,我得到了100000 loops, best of 3: 7.42 µs per loop,並且對於函數調用100000 loops, best of 3: 7.4 µs per loop

這只是爲了表明,有時候,性能的小改進帶來了可笑的小改進。

0

這要看情況。

如果您只想使用此對象一次,這不是問題。 如果您要實例化如此多的匿名對象而不是命名對象,則可能會發生問題,即您的程序效率低下且消耗大量內存。

這與函數和lambda表達式一樣。

+0

「匿名對象」中的對象沒有任何剩餘的引用,通常由垃圾收集器清理,這意味着它們不會佔用內存。 – TigerhawkT3

+0

是的,但您仍然需要創建它們,這需要時間並佔用內存。 – PatNowak