可以有任何的問題,可能會出現直接使用上創建實例類的方法一樣,?:實例化python類而不將實例分配給變量是否正常?
TmpClass('lol').printx()
參考類的例子:
class TmpClass:
def __init__(self, x):
self.x = x
def printx(self):
print self.x
可以有任何的問題,可能會出現直接使用上創建實例類的方法一樣,?:實例化python類而不將實例分配給變量是否正常?
TmpClass('lol').printx()
參考類的例子:
class TmpClass:
def __init__(self, x):
self.x = x
def printx(self):
print self.x
例如,如果你在循環中做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
。
這只是爲了表明,有時候,性能的小改進帶來了可笑的小改進。
這要看情況。
如果您只想使用此對象一次,這不是問題。 如果您要實例化如此多的匿名對象而不是命名對象,則可能會發生問題,即您的程序效率低下且消耗大量內存。
這與函數和lambda表達式一樣。
「匿名對象」中的對象沒有任何剩餘的引用,通常由垃圾收集器清理,這意味着它們不會佔用內存。 – TigerhawkT3
是的,但您仍然需要創建它們,這需要時間並佔用內存。 – PatNowak
爲什麼不,如果那是你打算做的?如果你以後不打算使用這個實例,那你爲什麼要把它分配給一個變量?我甚至會說將它分配給一個變量將會被誤導,任何下降IDE都會將該變量突出顯示爲未使用。 –
避免使用類似res = TmpClass('lol')。printx()的東西。 'lol'將被打印,但res將是None。 – Farseer
@Eli Korvigo,我是python新手,但努力改進。來自C,我謹慎對待所有對我而言並不直觀的東西。在這種情況下,我無法自己在網上找到信息。 – user1308345