passing named parameters is too slow
@cwg made the following comment in !215 (merged):
Here is a real-world benchmark based on the first Kwant tutorial:
import time
import kwant
lat = kwant.lattice.square()
def make_syst_const(W, L):
syst = kwant.Builder()
syst[(lat(x, y) for x in range(L) for y in range(W))] = 4
syst[lat.neighbors()] = -1
lead = kwant.Builder(kwant.TranslationalSymmetry(lat.vec((-1, 0))))
lead[(lat(0, j) for j in range(W))] = 4
lead[lat.neighbors()] = -1
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())
return syst
def onsite(site, t, u):
return 4 * t + u
def hopping(a, b, t, u):
return -t
def make_syst_vfs(W, L):
syst = kwant.Builder()
syst[(lat(x, y) for x in range(L) for y in range(W))] = onsite
syst[lat.neighbors()] = hopping
lead = kwant.Builder(kwant.TranslationalSymmetry(lat.vec((-1, 0))))
lead[(lat(0, j) for j in range(W))] = onsite
lead[lat.neighbors()] = hopping
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())
return syst
def make_syst_subs(W, L):
syst = kwant.Builder()
syst[(lat(x, y) for x in range(L) for y in range(W))] = onsite
syst[lat.neighbors()] = hopping
syst = syst.subs(t='tt', u='uu')
lead = kwant.Builder(kwant.TranslationalSymmetry(lat.vec((-1, 0))))
lead[(lat(0, j) for j in range(W))] = onsite
lead[lat.neighbors()] = hopping
lead = lead.subs(t='tt', u='uu')
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())
return syst
def main(W=50, L=50, energies=tuple(i/100 for i in range(50))):
for name, f, kwargs in [("consts", make_syst_const, {}),
("args", make_syst_vfs,
dict(args=(1, 0))),
("params", make_syst_vfs,
dict(params=dict(t=1, u=0))),
("subs", make_syst_subs,
dict(params=dict(tt=1, uu=0)))]:
syst = f(W, L).finalized()
t = time.time()
transmissions = [kwant.smatrix(syst, e, **kwargs).transmission(1, 0)
for e in energies]
print(name, time.time() - t)
if __name__ == '__main__':
main()
On my machine the output is:
consts 5.318358659744263
args 5.975970268249512
params 6.638056993484497
subs 14.160792112350464
Already "params" should be able to get way closer to "args". "params" is clearly out of proportion. There is no reason why "params" should not be almost as fast as "args".