Python - složení objektu za běhu

CPU

  • *****
  • 908
    • Zobrazit profil
    • E-mail
Python - složení objektu za běhu
« kdy: 25. 02. 2024, 18:20:42 »
Ahoj,

pro jednu modelaci potřebuji dynamicky skládat vlastní objekty z různých funkcí.
Objektů je bohužel opravdu hodně, takže je potřebuji ukládat na disk a pak znovu oživit, až na ně přijde řada.
Objekty cestují ze stroje na stroj, protože jeden server by to neutáhl, ale to jde díky uložení objektu.

Objekt N10000001: při svém vzniku dostane funkce main, F1, F33, F130 a F290
Funkce main postupně zavolá všechny vnitřní funkce od nejnižší.
Objekty přistupují do sdílených 2D MESH a používají centrální seznamy.

Aktuální stav:
Objekty vyrábím trotlovsky skriptem, prostě bokem, podle receptu vytvořím zdroják, načtu a pošlu do produkční pipeline.

Možná (???) lepší stav, vyrábět si objekty on the fly:
Rád bych ty objekty vyráběl přímo za běhu, bez skriptu, uvnitř hlavního vlákna.

Výhoda aktuálního stavu je ta, že to je primitivní, přímočaré a funguje to.
Z nějakého důvodu mi to přijde fuj, ale nejde mi vytvořit objekt za běhu tak, aby měl všechny funkce a main zavolala všechny interní metody. Chce to chytrou hlavu, zkušenějšího programátora, který by mi poradil, jak složit objekt za běhu.
« Poslední změna: 25. 02. 2024, 18:23:15 od CPU »


alex6bbc

  • *****
  • 1 677
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #1 kdy: 25. 02. 2024, 18:38:38 »
a data/membery maji ty objekty stejne?

co tak mit jen jeden objekt s memberem, ktery reprezentuje pole/seznam volanych funkci, bud jako string "f33","f44","f55", nebo referenci, nebo lambda.

a podle toho seznamu by se provolaly funkce.

takze bys mel hromadu instanci stejne tridy, kazda s jinym seznamem pouzitych funkci.

CPU

  • *****
  • 908
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #2 kdy: 25. 02. 2024, 18:46:01 »

To nejde, objekty chci offloadovat i do GPU.
Proto jsou malé a samostatné.
Vážně potřebuji ty objekty skládat z funkcí.

Jako, relevantní odpověď může být i to, že nejhloupější metoda (tu používám) je prostě nejsnazší.

alex6bbc

  • *****
  • 1 677
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #3 kdy: 25. 02. 2024, 18:59:50 »
a misto hafo funkci F1 az F333 nemuze byt jedna funkce s parametrem cisla funkce.

CPU

  • *****
  • 908
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #4 kdy: 25. 02. 2024, 19:08:08 »
a misto hafo funkci F1 az F333 nemuze byt jedna funkce s parametrem cisla funkce.

Těch funkcí je hodně a nemůžu dát do objektu všechny funkce, celý objekt by se měl vejít do 32kB včetně vlastních parametrů (chci aby se vešel kvůli cache). Pojmenování funkcí není důležité a můžu ho změnit. Ale objekt potřebuji sestavit tak, aby byl co nejmenší a moc nesahal do paměti.

Nemůžu vytvořit objekt ze všech funkcí (byl by velký) a objekt musí mít svoje funkce u sebe (jinak to nemá dobrý výkon).
« Poslední změna: 25. 02. 2024, 19:11:20 od CPU »


RDa

  • *****
  • 2 763
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #5 kdy: 25. 02. 2024, 19:16:02 »
Pokud maji objekty binarne maskovane metody (funkce jsou stejne, ale nevykonavaji se vsechny u kazde instance), tak to neni vhodny kandidat na vykonavani na GPU. GPU pracuje vektorizovane jako SIMD, coz je zde velice dulezity bod.

Prakticky na GPU by se takovato uloha resila stylem, ze se postupne naloaduji ty  metody/funkce - kernely, a vykonaji na celem datasetu, pak se zmeni funkce, a zas vykonaji na vsech.

Objekty, ktere funkci  nemaj aktivovanou, budou jenom zevlit a zrat zbytecne potencialni vykon gpu, ktera pro dany data pojede v alternativni code path.

Pokud je funkci stovky, ale k aktivaci dochazi jen u podmnoziny citajici jednotky, tak je cely  GPU akcelerovany pristup k nicemu - vase uloha nevykazuje znaky brutalniho paralelismu, na ktere jsou GPU stavena.

Re:Python - složení objektu za běhu
« Odpověď #6 kdy: 25. 02. 2024, 19:16:37 »
Šlo by ukázat nějaký příklad? Bez něj si to možná nedokážu správně představit.
Když píšeš, že objekty "dostanou" a "volají" funkce, tak ty funkce jsou teda nějak zabudované přímo v těch objektech? Když pak píšeš, že "celý objekt by se měl vejít do 32kB", tak to je včetně těch funkcí, které potřebuje?

alex6bbc

  • *****
  • 1 677
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #7 kdy: 25. 02. 2024, 19:37:32 »
python umi sestrojit object ze stringu, ze jsonu, tak to by melo jit ne?!

CPU

  • *****
  • 908
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #8 kdy: 25. 02. 2024, 19:48:07 »
python umi sestrojit object ze stringu, ze jsonu, tak to by melo jit ne?!

JJ, to mě taky napadlo, ale kámoš mi poslal odkaz na metatřídy a mám to nakombinovat s tímhle:
https://www.geeksforgeeks.org/create-classes-dynamically-in-python/

Teď se v tom rýpu...
Podle mě to je přesně to, co chci.
« Poslední změna: 25. 02. 2024, 19:51:38 od CPU »

Re:Python - složení objektu za běhu
« Odpověď #9 kdy: 27. 02. 2024, 13:10:09 »
Kód: [Vybrat]
x = [1, 2, 3]

def func1(_):
    print('func1')
   
def func2(_):
    print('func2')
   
def init(self):
    self.a = 10
    self.b = 20
    print('init object')
   
class_ = type('MyClass', (object,), {'__init__': init, 'x': x, 'func1': func1, 'func2': func2})
instance = class_()
print(instance.__dict__)
print(instance.x)
print(instance.a)
print(instance.b)
instance.func1()
instance.func2()

Týmto spôsobom je možné dynamicky vytvoriť triedy z funkcií, atribútov atď.

Re:Python - složení objektu za běhu
« Odpověď #10 kdy: 29. 02. 2024, 22:54:41 »
A v čem je tedy problém?

Kit

  • *****
  • 708
    • Zobrazit profil
    • E-mail
Re:Python - složení objektu za běhu
« Odpověď #11 kdy: 10. 03. 2024, 21:10:34 »
Kód: [Vybrat]
def func1(data):
    print('func1 {}'.format(data))

def func2(data):
    print('func2 {}'.format(data))

class Zaklad:
    def __init__(self, data):
        self.data = data
        self.seznam = []
    def add(self, funct):
        self.seznam.append(funct)
    def execute(self):
        for item in self.seznam:
            item(self.data)

obj1 = Zaklad(1)
obj1.add(func1)
obj1.add(func2)
obj2 = Zaklad(2)
obj2.add(func2)
obj2.add(func1)
obj3 = Zaklad(3)
obj3.add(func2)

objects=[]
objects.append(obj1)
objects.append(obj2)
objects.append(obj3)

for item in objects:
    item.execute()