元编程 - 更改 SIMD 计算的表示
Metaprogramming - change representation of SIMD calculation
在做 parallel/SIMD 工作时,我经常用下面的语法在函数 f
中表示计算。不过写起来有点容易出错,我想按照g
中定义的语法来写。有什么方法可以从 f
中的语法变成 g
?
dta=[[0,0,0,0],[0,0,0,0]]
VAR_ONE, VAR_TWO = range(2)
def f(ln):
dta[VAR_ONE][ln] = dta[VAR_ONE][ln] + 1
def g():
VAR_ONE = VAR_ONE + 1
for ln in range(4):
f(ln)
我不确定你在找什么,但我猜是这样的。您可以创建一个 class,它的属性可以满足您的需求(我认为)。
我的意思是:
class Class:
_VAR_ONE, _VAR_TWO = range(2)
def __init__(self, dta, ln):
self.dta = dta
self.ln = ln
def _getter(self):
return self.dta[self._VAR_ONE][self.ln]
def _setter(self, value):
self.dta[self._VAR_ONE][self.ln] = value
VAR_ONE = property(_getter, _setter)
def g(self):
self.VAR_ONE = self.VAR_ONE + 1
dta = [[0,0,0,0], [0,0,0,0]]
for ln in range(4):
inst = Class(dta, ln)
inst.g()
print(dta) # -> [[1, 1, 1, 1], [0, 0, 0, 0]]
在做 parallel/SIMD 工作时,我经常用下面的语法在函数 f
中表示计算。不过写起来有点容易出错,我想按照g
中定义的语法来写。有什么方法可以从 f
中的语法变成 g
?
dta=[[0,0,0,0],[0,0,0,0]]
VAR_ONE, VAR_TWO = range(2)
def f(ln):
dta[VAR_ONE][ln] = dta[VAR_ONE][ln] + 1
def g():
VAR_ONE = VAR_ONE + 1
for ln in range(4):
f(ln)
我不确定你在找什么,但我猜是这样的。您可以创建一个 class,它的属性可以满足您的需求(我认为)。
我的意思是:
class Class:
_VAR_ONE, _VAR_TWO = range(2)
def __init__(self, dta, ln):
self.dta = dta
self.ln = ln
def _getter(self):
return self.dta[self._VAR_ONE][self.ln]
def _setter(self, value):
self.dta[self._VAR_ONE][self.ln] = value
VAR_ONE = property(_getter, _setter)
def g(self):
self.VAR_ONE = self.VAR_ONE + 1
dta = [[0,0,0,0], [0,0,0,0]]
for ln in range(4):
inst = Class(dta, ln)
inst.g()
print(dta) # -> [[1, 1, 1, 1], [0, 0, 0, 0]]