Если вы делаете 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
.
Это просто, чтобы показать, что иногда небольшие улучшения в производительности приводят к смехотворным небольшим улучшениям.
Почему бы и нет, если это то, что вы намереваетесь сделать? Если вы не собираетесь использовать экземпляр позже, то почему вы должны назначить его переменной? Я бы даже сказал, что назначение его переменной будет ошибочным, и любая спускаемая IDE будет выделять переменную как неиспользованную. –
Избегайте использовать что-то вроде res = TmpClass ('lol'). Printx(). 'lol' будет напечатан, но res будет None. – Farseer
@Eli Korvigo, я новичок в python, но пытаюсь улучшить. Исходя из C, я принимаю с осторожностью все, что кажется мне неинтуитивным. В этом случае я не мог найти информацию в Интернете самостоятельно. – user1308345