LINUX.ORG.RU

Дилемма с переменными

 , , ,


1

3

В общем, есть у меня класс, в котором происходит относительно много мат. операций. И вследствие этого, имеется большое количество переменных. Сама суть скрипта в этих мат. операциях и заключается, поэтому к ним извне класса точно не будет надобности обращаться, в случае, если они будут глобальными.

Так вот, вопрос: с точки зрения производительности, имеет смысл делать все эти переменные локальными или оставлять их глобальными?



Последнее исправление: kramh (всего исправлений: 2)

Так вот, вопрос: с точки зрения производительности

Производительности не хватает? Замерял разницу?

loz ★★★★★
()

С какой стати локальные переменные медленнее?

goingUp ★★★★★
()

Расскажи нам, как у тебя появился класс с глобальными переменными.

anonymous
()

Смысл класса с кучей глобальных переменных? Вот есть у тебя класс, окей, теперь ты хочешь увеличить производительность, сделав их глобальными, но что изменится-то? Логика вся - в классе, все вычисления в методах у тебя и узкое место(если оно вообще есть) - именно там.

Но и не забывай главное правило - преждевременные оптимизации - это зло.

aarexer
()
Последнее исправление: aarexer (всего исправлений: 1)

с точки зрения производительности, имеет смысл делать все эти переменные локальными или оставлять их глобальными

Это всё экономия на спичках, делай как удобнее.

no-such-file ★★★★★
()
Ответ на: комментарий от trex6

Чтобы защитить код от попыток использования в многопоточной среде, от реентрантности, от дружественности к кэшу.

kramh: память бывает автоматическая, динамическая, статическая локальная, статическая глобальная.
Что из этого ты имеешь ввиду под «локальными»?

arturpub ★★
()

Я провел 2 немного разных теста для большей объективности, в обоих случаях вычисления non self оказывались в 3-3.5 раза быстрее, чем с self.

from datetime import *

class Name(object): 
    def __init__(self):
        self.NonSelf()
        self.Self()
    
        time_dfr_non_self = self.non_self_2 - self.non_self_1
        print('NonSelf: ', time_dfr_non_self)
        
        time_dfr_self = self.self_2 - self.self_1
        print('Self: ', time_dfr_self)
    
    def NonSelf(self):
        a = 0
        b = 1
        self.non_self_1 = datetime.now()
        while a != 100000000:
            a = a + b
        if a == 100000000:
            self.non_self_2 = datetime.now()

    
    def Self(self):
        self.a = 0
        self.b = 1
        self.self_1 = datetime.now()
        while self.a != 100000000:
            self.a = self.a + self.b
        if self.a == 100000000:
            self.self_2 = datetime.now() 

Name()
______
Output:

NonSelf:  0:00:06.368238
Self:  0:00:20.357640

kramh
() автор топика
Ответ на: комментарий от loz

Да, думаю, не на пустом. Если учиться оптимизировать код, то с самого начала, ибо потом переучиваться и/или исправлять свои говнопроекты будет геморно, особенно если ты работаешь над чем-то серьезным.

А для простых скриптов - да. Для них оптимизация не играет большой роли, но все же это будет отдельным плюсом.

kramh
() автор топика
Ответ на: комментарий от kramh

Если учиться оптимизировать код, то с самого начала, ибо потом переучиваться и/или исправлять свои говнопроекты будет геморно, особенно если ты работаешь над чем-то серьезным.

Нет, по-моему надо учиться архитектуре, чтобы понимать где будут боттлнеки и абрстрагировать их так, чтобы можно было нафигачить и побыстрее запустить, а в последствии отпимизировать и заменять эти части.

Изначальный упор на оптимизацию скорее всего не приведет к конечному результату вобще.

loz ★★★★★
()
Ответ на: комментарий от kramh

NonSelf: 0:00:06.368238
Self: 0:00:20.357640

Ha-ha. В этом весь питон.

loz ★★★★★
()
Ответ на: комментарий от kramh

В твоем случае я бы сделал функцию вычислений, тебе вроде объекты не нужны. Питон, в конце концов, и процедурный язык тоже.

loz ★★★★★
()

Нужны питон и производительность запускай много процессов.

Твой «nonSelf» держит переменные в locals(), там же где переменную «self», потому и быстрее.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot
 Нужны питон и производительность → запускай много процессов.

Не совсем понимаю, что ты имеешь ввиду под множеством процессов. Можно по подробнее?

kramh
() автор топика
Ответ на: комментарий от DonkeyHot

И про второй абзац: так в чем разница-то, если переменные в одном и том же месте в обоих случаях?

kramh
() автор топика
Ответ на: комментарий от kramh

Наверное, разница в этом:

doSomething(someVariable);
doSomething(self->someVariable);

Deleted
()
Ответ на: комментарий от kramh

Обращение через точку это dictionary lookup, и естественно это медленно. Пистон не годится для числодробилок.

Напиши модуль на Си.

redixin ★★★★
()

Как вы уже надоели!

Дилема | Лемма

anonymous
()
Ответ на: комментарий от kramh

множеством процессов. Можно по подробнее

Питонская программа работает медленно - слишком много накладных расходов. И разогнать его трудно. В общем случае, добиваться достаточной производительности стоит методами в порядке уменьшения потенциального выигрыша: 1. замена алгоритма менее ресурсоёмким, 2. параллельный запуск нескольких экземпляров программ с мелкими кусками задачи, 3. устранение накладных расходов за счёт переписывание на непитонах,... то, о чём ты спрашивал, где-то во втором десятке, т.е. вообще не стоит рассмотрения.

в чем разница-то

google python namespaces

DonkeyHot ★★★★★
()
Ответ на: комментарий от kramh

Чегойто вдруг? Оно компилится так же как и обычно.

redixin ★★★★
()
Ответ на: комментарий от DonkeyHot

Как я уже писал, это увеличивает производительность в 3-3.5 раз. Так что я сомневаюсь, что это стоит игнорировать

Думаю, в самом лучшем раслкладке производительность процентов на >50 будет страдать.

kramh
() автор топика

с точки зрения производительности
питон

ну ты понял, да.

добавь рутнон в теги, чудила.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.